在SQL Server中将IN子句与变量标量一起使用

时间:2018-07-12 17:31:29

标签: sql-server tsql

我正在尝试使此示例正常运行,但每次都会失败并显示不良响应。您能告诉我为什么吗?谢谢

DECLARE @CARACS NVARCHAR(max) = 'DLV, DLC'

SELECT 
    CASE 
       WHEN 'DLV' IN (@CARACS) 
          THEN 'GOOD' 
          ELSE 'BAD' 
    END

2 个答案:

答案 0 :(得分:1)

这是问题... DECLARE @CARACS NVARCHAR(max)='DLV,DLC'。  唯一可行的方法是将其拆分……因为DLV永远不会与SQL Server'DLV,DLC'等于'DLV,DLC'一样。

DECLARE @CARACS1 NVARCHAR(max) = 'DLV', @CARACS2 NVARCHAR(max) = 'DLC'

SELECT 
    CASE 
      WHEN 'DLV' = @CARACS1 OR 'DLV' = @CARACS2
      THEN 'GOOD' 
      ELSE 'BAD' 
END

答案 1 :(得分:1)

这里有2个查询,如果您能够找到它们之间的区别,那么您将理解为什么查询返回“ Bad”值:

SELECT 
    CASE 
       WHEN 'DLV' IN ('DLV, DLC') 
          THEN 'GOOD' 
          ELSE 'BAD' END


SELECT 
    CASE 
       WHEN 'DLV' IN ('DLV', 'DLC') 
          THEN 'GOOD' 
          ELSE 'BAD' END

说明:
“ DLV,DLC”-是一个值。

'DLV','DLC'-两个值。

因此,将“ DLV,DLC”转换为几个单独的值,您需要使用拆分器功能。

(我使用了Jeff Moden的分离器-DelimitedSplit8K)

DECLARE @CARACS VARCHAR(8000) = 'DLV,DLC'

SELECT 
    CASE 
       WHEN 'DLV' IN (select * from dbo.DelimitedSplit8K(@CARACS,',')) 
          THEN 'GOOD' 
          ELSE 'BAD' 
    END