在IN子句中使用CASE语句

crj*_*unk 11 sql t-sql sql-server sql-server-2008

可以在IN子句中使用CASE语句吗?

这是我试图正确编译的简化版本:

SELECT * FROM MyTable 
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )
Run Code Online (Sandbox Code Playgroud)

谢谢!

Red*_*ter 25

CASE仅返回标量值.你可以这样做.(我假设,根据您的示例,当@StatusID = 99时,StatusID值为99不匹配.)

select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
    or (@StatusID <> 99 and StatusID = @StatusID)
Run Code Online (Sandbox Code Playgroud)

  • @LittleBobbyTables 有了你的名字,我相信你可以在后端更改它:) (2认同)

Gor*_*off 6

不。相反,您可以将其放在外面

SELECT *
FROM MyTable
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1
                WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1
                ELSE 0
           END)
Run Code Online (Sandbox Code Playgroud)

您也可以不使用 case 语句来编写此内容。

另一种选择是动态 SQL,您实际上使用 SQL 语句创建一个字符串,然后执行它。然而,在这种情况下,动态 SQL 似乎有点矫枉过正。