能否将SELECT子句中的CASE WHEN EXISTS移至WHERE子句?
问题解答
首先明确结论:不能把SELECT子句里的CASE WHEN EXISTS直接移到WHERE子句中,原因很简单——两者的作用完全不一样:
- SELECT里的CASE语句是用来给每一行生成一个标识列(Y/N),不会丢弃任何员工记录,正好符合你要输出所有员工的需求。
- WHERE子句的作用是筛选行,如果把EXISTS条件放到WHERE里,只会留下那些在
m_emp_config表中存在EC_CODE='CONFIG_1'记录的员工,直接丢失了那些没有对应配置的员工,完全不符合你要输出所有员工并标记Y/N的预期。
正确的写法示例(保留原有CASE WHEN EXISTS逻辑)
SELECT e.ENAME, CASE WHEN EXISTS ( SELECT 1 FROM m_emp_config ec WHERE ec.EMP_ID = e.EMP_ID AND ec.EC_CODE = 'CONFIG_1' ) THEN 'Y' ELSE 'N' END AS CONFIG FROM emp e;
另一种更直观的写法(用左连接实现)
如果觉得子查询不好理解,也可以用左连接的方式实现同样的效果:
SELECT e.ENAME, CASE WHEN ec.EMP_ID IS NOT NULL THEN 'Y' ELSE 'N' END AS CONFIG FROM emp e LEFT JOIN m_emp_config ec ON e.EMP_ID = ec.EMP_ID AND ec.EC_CODE = 'CONFIG_1';
左连接会保留emp表的所有记录,当员工有匹配的配置记录时,ec.EMP_ID不为空,否则为NULL,以此来判断标记Y/N。
内容的提问来源于stack exchange,提问作者smriti
相关产品推荐
相关产品推荐

