我尝试用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
答案 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 ...