我需要在存储过程中使用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。
答案 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