WHERE子句中具有IN条件的CASE语句

时间:2019-10-30 15:50:55

标签: sql sql-server

SQL Server查询的CASE子句中是否可以有带有IN条件的WHERE语句?

我尝试在@DivisionCode = 'UK'之外返回所有英国事件,否则将返回美国和加拿大的所有事件。

我已经尝试过了,但是没有运气:

SELECT * FROM Events
WHERE Division IN (CASE WHEN @DivisionCode = 'UK' THEN 'UK' ELSE 'CA,' + 'US' END))

2 个答案:

答案 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的逻辑“流”,其中表达式返回标量值。