SQL中如何根据传入的@district参数使用不同的选择比较条件?
原代码报错原因
SQL 中 CASE 是标量值表达式,只能返回单个值,不能直接将布尔判断结果(IN/等于条件的返回值)作为 CASE 的输出用在 WHERE 子句中,所以你的写法会触发语法错误。
推荐实现方案
直接用逻辑运算符 OR 组合两个分支的判断条件即可,写法通用兼容绝大多数 SQL 引擎:
AND ( -- 分支1:参数为Other时走IN多值匹配 (@district = 'Other' AND I.Offense_Tract IN ('BAR','COL','GER','MEM','MIL','JAIL','JAILEAST','SCCC','1USD','2USD')) OR -- 分支2:参数为其他值时走精确匹配 (@district != 'Other' AND I.Offense_Tract = @district) )
如果需要兼容@district为NULL的场景,可以在括号内最前面补充@district IS NOT NULL AND限制即可。
可选CASE改写方案(不推荐)
如果你的场景必须用CASE语法实现,可调整为标量值匹配的写法,可读性和执行效率都弱于上面的方案:
AND 1 = CASE WHEN @district = 'Other' AND I.Offense_Tract IN ('BAR','COL','GER','MEM','MIL','JAIL','JAILEAST','SCCC','1USD','2USD') THEN 1 WHEN @district != 'Other' AND I.Offense_Tract = @district THEN 1 ELSE 0 END
内容的提问来源于stack exchange,提问作者Steve Cross
相关产品推荐
相关产品推荐

