使用条款里面CASE语句(Using CASE Statement inside IN Clause

2019-06-25 20:26发布

是可以使用IN子句中一个CASE语句?

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

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

谢谢!

Answer 1:

CASE只返回一个标量值。 你可以这样做,而不是。 (我假设,按您的例子中,当@StatusID = 99,99一个StatusID值不匹配)。

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


Answer 2:

取而代之号,你可以把它放在外面

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好像在这种情况下矫枉过正。



Answer 3:

我想我会尝试不同的这种使用表Valuue构造 - 被TVCS不能在以下情况下允许吗?

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


Answer 4:

为此,您可以使用TVCS,但是这种方法有一点不同。 它不使用的情况下,但它会更规模很好,那里有许多可能的选项可供选择:

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)


文章来源: Using CASE Statement inside IN Clause