首页 > 解决方案 > T sql Case in Where 子句

问题描述

我知道这已被问过几次,但我似乎无法解决这个问题。我在这里做错了什么?

WHERE B.ACCTSET IN CASE 
        WHEN @AcctSet ='Maize' THEN ('001X04','010X04')
        WHEN @AcctSet ='Wheat' THEN ('002X04')
        ELSE ('004X04')
        END

帮助将不胜感激。

标签: tsqlcase

解决方案


CASE 语句只能返回一个值,因此'Maize' 行将不起作用。

CASE 语句也将在括号内。

WHERE B.ACCTSET IN (CASE 
        WHEN @AcctSet ='Maize' THEN '001X04'
        WHEN @AcctSet ='Wheat' THEN '002X04'
        ELSE '004X04'
        END
       )

如果结果像您的示例中一样固定,那么您可以创建一个表 var 并根据您的逻辑将记录插入其中,然后加入该表或在您的 IN() 中使用它。

DECLARE @Values TABLE( [Value] VARCHAR(6))

IF @AcctSet ='Maize'
BEGIN
   INSERT INTO @Values VALUE('001X04')
   INSERT INTO @Values VALUE('010X04')
END
ELSE IF @AcctSet ='Wheat'
BEGIN
   INSERT INTO @Values VALUE('002X04')
END
ELSE
BEGIN
   INSERT INTO @Values VALUE('004X04')
END

/..snip../
WHERE WHERE B.ACCTSET IN (SELECT [Value] FROM @Values)

推荐阅读