CASE WHEN中能否使用IN运算符?SQL语法报错问题咨询
问题解答
语法可行性说明
你用到的这种IN子查询直接放在CASE WHEN条件中的写法,在部分SQL引擎(比如DB2,从DIGITS函数判断你大概率用的是这个)里是不被支持的,这就是报错Comparison operator IN not valid的原因。
解决方法
用EXISTS子查询替代IN,这是兼容性更好的写法,能绕过IN运算符的语法限制。修改后的SQL如下:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM TABLE_2 WHERE DIGITS(C) || DIGITS(D) = DIGITS(A) || DIGITS(B) ) THEN x ELSE y END AS MY_VAR FROM TABLE_1
逻辑说明
EXISTS子查询会检查TABLE_2中是否存在与当前TABLE_1记录的DIGITS(A)||DIGITS(B)匹配的DIGITS(C)||DIGITS(D)值,存在则返回TRUE,进入THEN分支,否则走ELSE分支,逻辑和你原来的IN写法完全一致,但能正常执行。
如果TABLE_2的拼接值存在大量重复,还可以提前用WITH子句去重后再关联,优化查询性能:
WITH TABLE_2_CONCAT AS ( SELECT DISTINCT DIGITS(C) || DIGITS(D) AS CONCAT_VAL FROM TABLE_2 ) SELECT CASE WHEN EXISTS ( SELECT 1 FROM TABLE_2_CONCAT WHERE CONCAT_VAL = DIGITS(A) || DIGITS(B) ) THEN x ELSE y END AS MY_VAR FROM TABLE_1
内容的提问来源于stack exchange,提问作者LBedo
相关产品推荐
相关产品推荐

