WHERE子句中的SQL查询错误CASE语句

时间:2015-03-17 17:29:09

标签: sql-server database sql-server-2008

我需要在存储过程中使用WHERE表达式CASE条件。我尝试了下面的内容,但是在第三行的=符号上出现错误。请有人纠正我/指出类似情况的例子吗?

WHERE CASE WHEN @Param1 IS null THEN (
  (@Param1 = '(All)')
  OR (@Param1 = '(Ready)' AND t.Column1 NOT IN ('Descoped','Done'))
  OR (@Param1 = '(Pending)' AND t.Column1 NOT IN ('Descoped','Done')
    AND t.Column2 IN ('Deferred','Rejected','Ready for Test'))
  OR (@Param1 = t.Column1 )
ELSE (
  t.Column1 = 'WIP'
  OR t.Column1 ='Not Started'
) END

该查询仅用于表示。我正在使用MS SQL 2008 R2。

2 个答案:

答案 0 :(得分:1)

您无法在大多数SQL方言(包括SQL Server)中将条件置于case内。一般来说,如果你在case条款中使用where,那么你就是在追求一个糟糕的解决方案。正确的方法是使用布尔逻辑重写整个事物:

WHERE  ( @Param1 IS NOT NULL 
         AND ( @Param1 IN ( '(All)', t.column1 ) 
                OR ( @Param1 = '(Ready)' 
                     AND t.column1 NOT IN ( 'Descoped', 'Done' ) ) 
                OR ( @Param1 = '(Pending)' 
                     AND t.column1 NOT IN ( 'Descoped', 'Done' ) 
                     AND t.column2 IN ( 'Deferred', 'Rejected', 'Ready for Test' ) ) ) ) 
        OR ( @Param1 IS NULL 
             AND t.column1 IN ( 'WIP', 'Not Started' ) ) 

就此而言,检查@Param1是否为空是否有点无意义。由于null = anything始终为false,因此查询前半部分中的所有条件都将返回false @Param1为空。这应该以更直接的方式完成您的尝试:

WHERE  @Param1 IN ( '(All)', t.column1 ) 
        OR ( @Param1 = '(Ready)' 
             AND t.column1 NOT IN ( 'Descoped', 'Done' ) ) 
        OR ( @Param1 = '(Pending)' 
             AND t.column1 NOT IN ( 'Descoped', 'Done' ) 
             AND t.column2 IN ( 'Deferred', 'Rejected', 'Ready for Test' ) ) 
        OR ( @Param1 IS NULL 
             AND t.column1 IN ( 'WIP', 'Not Started' ) ) 

答案 1 :(得分:0)

SQL中的大小写返回一个值。它不是控制流程。如果你需要根据变量匹配不同的条件,你可能应该写这样的东西

select * from myTable t
where t.id =
case when @Param1 is null then
    2
else
    1
End