如何在where condition(sql)中使用case语句?

时间:2016-06-15 11:40:11

标签: sql sql-server case

我尝试用sql编写一个获取一个参数的查询,并在下面查询的哪个部分使用此参数但得到错误: 我想这样做:

如果@state等于2签入where条件@state=2

如果@state等于3签入where条件@state=3

如果@state等于0,则不要签入where条件

我尝试用case写这个语句但是得到语法错误

SELECT *
FROM   tbl1
WHERE  @StartDate <= Cast([date] AS DATE)
       AND Cast([date] AS DATE) <= @endDate
       AND [reservetype] = @Type
       AND  CASE
                       WHEN @State = 2 THEN [state]=2
                       WHEN @State = 3 THEN [state]=3
                       WHEN @State = 0 then ....
                     END  

2 个答案:

答案 0 :(得分:1)

如果你想使用case,那么逻辑是:

[state] = (CASE WHEN @State IN (2, 3) THEN @state
                ELSE [state]
           END)

假设state不是NULL

,这就是您想要的

注意:

我会将条件写为:

WHERE [date] >= @StartDate AND
      [date] < DATEADD(day, 1, @endDate) AND
      [reservetype] = @Type AND
      ((@state IN (2, 3) and [state] = @state) OR
       (@state NOT IN (2, 3))
      )

我更改了日期算术以删除cast()。虽然SQL Server可以在将日期/时间转换为date时使用索引,但它可能会与复杂的WHERE子句混淆。因此,此版本可能会根据索引进行更好的优化。

答案 1 :(得分:1)

如果我没弄错,你想要这个微不足道的逻辑:

...
WHERE (@State = 0 or t.State = @State)
   AND ...