SQL在WHERE IN子句中使用CASE语句

POI*_*OIR 20 sql select case switch-statement where-in

where子句中使用case是否可行?像这样的东西:

 DECLARE @Status VARCHAR(50);
 SET @Status='published';

 SELECT * FROM Product P    
 WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3)
                                   WHEN @Status='standby' THEN (2,5,9,6)
                                   WHEN @Status='deleted' THEN (4,5,8,10)
                                   ELSE (1,3)
                                   END)
Run Code Online (Sandbox Code Playgroud)

此代码提供错误:','附近的语法不正确.

jue*_*n d 27

不,你不能使用casein喜欢这个.但你可以做到

SELECT * FROM Product P    
WHERE @Status='published' and P.Status IN (1,3)
or @Status='standby' and P.Status IN  (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以减少到

SELECT * FROM Product P    
WHERE @Status='standby' and P.Status IN (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)
Run Code Online (Sandbox Code Playgroud)

既然or P.Status IN (1,3)给你所有的记录@Status='published' and P.Status IN (1,3)

  • 不要认为你需要括号,但最后的`或'语句将返回错误的结果...看到这个小提琴 - 不应该返回第二条记录.http://sqlfiddle.com/#!3/9aef0/6 (4认同)
  • 你不需要围绕每个"或"条款括号吗?例如或(@ Status ='standby'和P.Status IN(2,5,9,6)) (2认同)

sge*_*des 9

我意识到这已经得到了回答,但是接受的解决方案存在一些问题.它会返回误报.易于修复:

SELECT * FROM Products P    
WHERE (@Status='published' and P.Status IN (1,3))
   or (@Status='standby' and P.Status IN  (2,5,9,6))
   or (@Status='deleted' and P.Status IN (4,5,8,10))
   or (@Status not in ('published','standby','deleted') and P.Status IN (1,2))
Run Code Online (Sandbox Code Playgroud)

不需要括号(尽管可能更容易阅读,因此我将它们包括在内).