where 子句中的 case 表达式包含多个值

米切尔·加德纳

我有多个具有单一识别码的客户端和 2 个具有多个标识符的客户端。我试图找到一种好方法,将客户端代码用作 where 子句中单个和多个代码的存储过程的参数。

我目前有一个变量,它接受输入的参数并将其转换为单个字符(客户端代码),但使用带有“in”的变量不起作用。我还尝试将客户端代码格式化为 where 子句中的 case 表达式,但无法弄清楚它的格式。

ALTER PROCEDURE [dbo].[client_tonnage] @input varchar(100)
as

select input = 
   case
       when @input = 'client1' then 'C1'
       when @input = 'client2' then '''C2'', ''C3'', ''C4'''

if object_id('tempdb..#temp_table') is not null drop table #temp_table

insert into #temp_table (date_time, clientid, ACTUAL_WEIGHT) 
from Log
where clientid in (@input)

select * from #temp_table

我希望能够包含具有多个客户端代码的客户端,但上述格式不起作用。任何解决方法将不胜感激!

埃兹洛

如果要保存多个值,请使用表变量:

ALTER PROCEDURE [dbo].[client_tonnage] @input varchar(100)
as
BEGIN

    DECLARE @ClientIDs TABLE (ClientID VARCHAR(10))

    IF @input = 'client1'
        INSERT INTO @ClientIDs (ClientID) VALUES ('C1')
    ELSE IF @input = 'client2'
        INSERT INTO @ClientIDs (ClientID) VALUES ('C2'),('C3'),('C4')

    if object_id('tempdb..#temp_table') is not null 
        drop table #temp_table

    insert into #temp_table (date_time, clientid, ACTUAL_WEIGHT) 
    SELECT
        -- The proper columns
    from 
        Log AS L
        INNER JOIN @ClientIDs AS C ON L.clientid = C.ClientID

    select * from #temp_table

END

尽管您对输入和客户端 ID 之间的“映射”进行了硬编码。更好的方法是将此关系存储在物理表中:

CREATE TABLE ClientMappings (
    ClientID VARCHAR(10) PRIMARY KEY,
    ClientCode VARCHAR(10))

INSERT INTO ClientMappings (
    ClientID,
    ClientCode)
VALUES
    ('C1', 'client1'),
    ('C2', 'client2'),
    ('C3', 'client2'),
    ('C4', 'client2')

所以你用一个简单的连接来解决这个问题:

ALTER PROCEDURE [dbo].[client_tonnage] @input varchar(100)
as
BEGIN

    if object_id('tempdb..#temp_table') is not null 
        drop table #temp_table      

    insert into #temp_table (date_time, clientid, ACTUAL_WEIGHT) 
    SELECT
        -- The proper columns
    from 
        Log AS L
        INNER JOIN ClientMappings AS C ON L.clientid = C.ClientID
    WHERE
        C.clientcode = @input

    select * from #temp_table

END

此外,如果您的 SP只是选择此数据,则不需要临时表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在where子句中使用Case语句选择多个值

来自分类Dev

oracle中where子句的case语句中传递多个值

来自分类Dev

CASE语句中的WHERE子句

来自分类Dev

where子句中的if / case语句

来自分类Dev

WHERE子句中的CASE表达式选择不为NULL的行

来自分类Dev

具有 NULL 值的 where 子句中的 SQL Switch/Case

来自分类Dev

case子句在where子句中的用法

来自分类Dev

SQL:Where子句中的case子句

来自分类Dev

where子句中的多个AND

来自分类Dev

SQL查询的WHERE子句中的CASE语句

来自分类Dev

Where子句中的参数Case语句

来自分类Dev

使用case语句或如果WHERE子句中

来自分类Dev

在WHERE子句中合并CASE和BETWEEN

来自分类Dev

SQL:WHERE子句中的IF / CASE语句

来自分类Dev

在where子句中使用case语句

来自分类Dev

如何与Where子句中的Case进行比较

来自分类Dev

mysql中where子句中的CASE语句

来自分类Dev

SQL语句where子句中的case语句

来自分类Dev

WHERE 子句中的 MDX case 语句

来自分类Dev

以下要求的 WHERE 子句中的 CASE 或 IF 条件

来自分类Dev

where子句中的MySql case条件

来自分类Dev

使用 IN 语句的 Where 子句中的 Case 语句

来自分类Dev

在 where 子句中加入的 Case 语句

来自分类Dev

返回结果集的 where 子句中的 case 语句包含空值

来自分类Dev

WHERE子句中的多个查询

来自分类Dev

where子句中的NULL值

来自分类Dev

WHERE 子句中的 SET 值

来自分类Dev

SQL where子句中大于或小于case语句的子句

来自分类Dev

WHERE 子句中 CASE 语句中的 BETWEEN 问题