12

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

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

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

谢谢!

4

4 回答 4

28

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

select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
    or (@StatusID <> 99 and StatusID = @StatusID)
于 2012-06-27T18:00:56.557 回答
5

不,相反,你可以把它放在外面

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)

您也可以在没有 case 语句的情况下编写它。

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

于 2012-06-27T18:02:17.893 回答
0

我想我会尝试使用表值构造函数进行不同的尝试——在以下情况下不允许 TVC 吗?

SELECT * 
FROM MyTable  
WHERE StatusID IN 
   ( 
   SELECT 
       CASE 
         WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
         ELSE @StatusID 
   END  
   ) 
于 2012-06-28T06:35:26.020 回答
0

您可以使用 TVC 执行此操作,但方法略有不同。它没有用例,但在有许多可能的选项可供选择的情况下,它会更好地扩展:

SELECT * 
FROM MyTable  
join (values 
      (99,5),(99,11),(99,13),
      (@StatusID , @StatusID)    
    ) t(k,v) on t.k= @StatusID and t.v = StatusID)

或者如果您需要 where 子句中的所有内容,那么:

SELECT * 
FROM MyTable  
WHERE exists (
    select 1
    from (values 
      (99,5),(99,11),(99,13),
      (@StatusID , @StatusID)    
    ) t(k,v)
    where t.k= @StatusID and t.v = StatusID)
于 2014-06-19T12:21:24.907 回答