SQL Server查询的CASE
子句中是否可以有带有IN
条件的WHERE
语句?
我尝试在@DivisionCode = 'UK'
之外返回所有英国事件,否则将返回美国和加拿大的所有事件。
我已经尝试过了,但是没有运气:
SELECT * FROM Events
WHERE Division IN (CASE WHEN @DivisionCode = 'UK' THEN 'UK' ELSE 'CA,' + 'US' END))
答案 0 :(得分:2)
您不需要case
中的where
。只需使用布尔逻辑:
SELECT e.*
FROM Events e
WHERE (@DivisionCode = 'UK' AND Division = 'UK') OR
(@DivisionCode <> 'UK' AND Division IN ('CA', 'US'));
这假设@DivisionCode
不是NULL
。如果可能的话,可以很容易地将NULL
值合并到逻辑中。
答案 1 :(得分:2)
似乎您喜欢布尔逻辑:
SELECT {columns}
FROM dbo.Events E
WHERE (E.Division = 'UK' AND @DivisionCode = 'UK')
OR (E.Division IN ('CA','US') AND @DivisionCode IS NULL); --Assumes DivisionCode won't have a value
但是,与此有关的问题是,您所拥有的只是一个范围广泛的查询。因此,您可能对于正在运行的查询,其缓存计划的查询计划较差。一种解决方法是在查询末尾添加OPTION (RECOMPILE)
,每次都创建查询计划。否则,您可以使用IF
逻辑和2条语句:
IF @DivisionCode = 'UK'
SELECT {columns}
FROM dbo.Events E
WHERE E.Division = 'UK';
ELSE
SELECT {columns}
FROM dbo.Events E
WHERE E.Division IN ('US','CA');
为简单起见,我想说后者会更好。
注意:T-SQL中没有Case
语句。您有一个CASE
表达式。 Case
语句与IF
相似,它们更改了SQL的逻辑“流”,其中表达式返回标量值。