WHERE子句内嵌CASE子句报错:SSMS中SQL代码无法运行求助
问题原因及解决方法
你这段SQL无法运行的核心原因是:SQL Server的CASE表达式只能返回单个标量值,不能直接返回('HeO','OST')这类多值集合,IN子句无法识别CASE返回的多值结果,直接触发语法错误。
修正后的写法
写法一:用逻辑条件组合替代CASE
这是最直观的方式,把CASE的分支逻辑拆成WHERE里的AND/OR组合:
SELECT * FROM TabKontaktJednani where ( -- 替换成你的原查询:(SELECT ALIAS FROM TabCisZam where LoginId = SUSER_NAME()) 'ERP' = 'ERP' AND TabKontaktJednani.Typ IN ('HeO','OST') ) OR ( 'ERP' = 'TO' AND TabKontaktJednani.Typ IN ('SW','OST') )
写法二:提取公共值简化逻辑
观察你的条件,不管是ERP还是TO分支,都包含OST这个值,所以可以简化成:
SELECT * FROM TabKontaktJednani where TabKontaktJednani.Typ = CASE WHEN 'ERP' = 'TO' THEN 'SW' ELSE 'HeO' END OR TabKontaktJednani.Typ = 'OST'
写法三:用CROSS APPLY构造动态集合
如果后续分支更多,这种方式扩展性更好:
SELECT t.* FROM TabKontaktJednani t CROSS APPLY ( SELECT val FROM (VALUES (CASE WHEN 'ERP' = 'ERP' THEN 'HeO' END), (CASE WHEN 'ERP' = 'ERP' THEN 'OST' END), (CASE WHEN 'ERP' = 'TO' THEN 'SW' END), (CASE WHEN 'ERP' = 'TO' THEN 'OST' END) ) AS v(val) WHERE val IS NOT NULL ) AS filter WHERE t.Typ = filter.val
内容的提问来源于stack exchange,提问作者ondrejheryan
相关产品推荐
相关产品推荐

