SQL查询ON子句按lob值选关联字段的语句修复咨询
SQL查询问题修复方案
原SQL存在的问题
- 语法错误:CASE WHEN 表达式缺少闭合的
END关键字,执行直接报错 - 兼容性缺陷:部分数据库不支持CASE表达式直接返回布尔判断结果,即使补全END也无法正常执行
- 性能隐患:关联条件中嵌套CASE表达式会导致数据库无法命中id、no字段的索引,数据量级大时查询效率极差
推荐修复方案(全数据库兼容+性能最优)
直接用布尔逻辑拆分关联条件,无需CASE表达式,语法通用且可利用字段索引:
SELECT a.column1,b.column1 FROM table1 a INNER JOIN table2 b ON a.region = b.region AND ( -- lob匹配指定值时走id关联 (a.lob IN ('lob1', 'lob2') AND a.id = b.id) -- 其余情况走no关联 OR (a.lob NOT IN ('lob1', 'lob2') AND a.no = b.no) )
注意:如果
a.lob字段存在NULL值,需额外补充a.lob IS NULL的分支判断,避免NOT IN逻辑出现异常。
可选修复方案(仅兼容支持CASE返回布尔值的数据库)
补全原SQL的CASE闭合关键字即可:
SELECT a.column1,b.column1 FROM table1 a INNER JOIN table2 b ON a.region = b.region AND CASE WHEN a.lob IN ('lob1','lob2') THEN a.id = b.id ELSE a.no = b.no END
内容的提问来源于stack exchange,提问作者viresh
相关产品推荐
相关产品推荐

