在 SQL Server 中,如何在案例条件下使用"in"语句?


declare @itemList nvarchar(100) = '43,78'
SELECT * FROM ItemMaster
WHERE ItemID = case when @itemList = '0' THEN ItemID ELSE IN (@itemList)

当@itemList为0并且@itemList具有逗号分隔的值时,我想要ItemMaster表中的所有项,只获取这些ID。我试着用上面的代码来做这件事,但它不起作用。我该怎么做?

您应该使用某种类型的表(可能是表变量(来传递值。这会让事情变得更简单。但你可以做到:

SELECT im.*
FROM ItemMaster
WHERE @ItemList = '' OR   -- a much more reasonable value for "all"
im.ItemID IN (SELECT value FROM SPLIT_STRING(@itemList, ','));

在旧版本的SQL Server中,您可以使用:

SELECT im.*
FROM ItemMaster
WHERE @ItemList = '' OR   -- a much more reasonable value for "all"
',' + @itemList + ',' LIKE '%,' + CONVERT(VARCHAR(255), im.ItemID) + ',%';

不要。CASE是返回标量值的表达式,而不是表达式。使用CASE就是WHERE将影响查询的SAR可扩展性。坚持使用正确的布尔逻辑。

在这种情况下,你似乎只是在追求:

WHERE @ItemList = 0
OR ItemID IN (SELECT item FROM STRING_SPLIT(@ItemList','));

然而,就我个人而言,我更喜欢传递NULL而不是0作为"catch-all"参数。此外,如果这是一个包罗万象的查询,您可能希望添加RECOMPILE选项以避免糟糕的计划缓存:

WHERE @ItemList IS NULL
OR ItemID IN (SELECT item FROM STRING_SPLIT(@ItemList','))
OPTION (RECOMPILE);