SQL Server WHERE子句中能否使用CASE语句搭配IN条件?
解决SQL Server中CASE搭配IN条件的问题
嘿,我懂你碰到的麻烦了——你原来写的SQL语句之所以没效果,是因为CASE表达式只能返回单一值。你在ELSE里把'CA'和'US'拼接成了'CA,US',但IN子句会把这个字符串当成单个匹配项去查找,而不是把它拆成两个独立的地区代码,自然查不到你想要的结果啦。
给你几个可行的解决方案:
方案1:直接用逻辑判断代替CASE(最推荐)
这种写法逻辑清晰,性能也更好,数据库更容易优化执行计划:
SELECT * FROM Events WHERE -- 当@DivisionCode是UK时,只匹配UK地区 (@DivisionCode = 'UK' AND Division = 'UK') -- 否则匹配US和CA地区 OR (@DivisionCode <> 'UK' AND Division IN ('CA', 'US'))
方案2:用CASE配合逻辑实现多值匹配(如果一定要用CASE的话)
如果坚持要用到CASE,可以换个思路,让CASE帮我们锁定特定场景的匹配规则:
SELECT * FROM Events WHERE Division = CASE WHEN @DivisionCode = 'UK' THEN 'UK' ELSE Division END AND (@DivisionCode = 'UK' OR Division IN ('CA', 'US'))
不过说实话,这个写法不如方案1直观,所以还是优先选方案1更合适。
为什么你的原写法不行?
再强调下核心问题:CASE是标量表达式,每次只能返回一个值。你写的'CA,' + 'US'最终会变成'CA,US',IN子句会去寻找Division = 'CA,US'的记录,而不是Division = 'CA' OR Division = 'US',这完全偏离了你想要的逻辑~
内容的提问来源于stack exchange,提问作者user1263981
相关产品推荐
相关产品推荐

