两段含不同CASE表达式的SQL返回结果不同,深层差异是什么?
两段SQL CASE表达式结果差异的深层原因分析
以下两段SQL因CASE表达式的写法不同返回了完全不同的结果,其背后的深层差异如下:
第一段SQL(符合业务逻辑)
select course_name, case when course_id in (select course_id from OpenCourses where month = 200706) then 'o' else 'x' end as JUNE, case when course_id in (select course_id from OpenCourses where month = 200707) then 'o' else 'x' end as JULY, case when course_id in (select course_id from OpenCourses where month = 200708) then 'o' else 'x' end as AUG from CourseMaster
第二段SQL(逻辑错误)
select course_name, case when course_id = 200706 then 'o' else 'x' end as JUNE, case when course_id = 200707 then 'o' else 'x' end as JULY, case when course_id = 200708 then 'o' else 'x' end as AUG from CourseMaster
附建表及插入数据脚本
CREATE TABLE CourseMaster ( course_id INTEGER PRIMARY KEY, course_name VARCHAR(32) NOT NULL ); INSERT INTO CourseMaster VALUES(1, 'English'); INSERT INTO CourseMaster VALUES(2, 'Math'); INSERT INTO CourseMaster VALUES(3, 'Pyhsics'); INSERT INTO CourseMaster VALUES(4, 'Chemistry'); CREATE TABLE OpenCourses ( month INTEGER, course_id INTEGER, PRIMARY KEY(month, course_id) ); INSERT INTO OpenCourses VALUES(200706, 1); INSERT INTO OpenCourses VALUES(200706, 3); INSERT INTO OpenCourses VALUES(200706, 4); INSERT INTO OpenCourses VALUES(200707, 4); INSERT INTO OpenCourses VALUES(200708, 2); INSERT INTO OpenCourses VALUES(200708, 4);
核心差异解析
这两段SQL的本质是判断逻辑完全错位,对应业务含义天差地别:
第一段SQL:基于「课程-月份」的关联关系做判断
每个CASE语句的in子查询,是在检查当前课程是否存在于对应月份的开课列表中。比如JUNE列的逻辑是:「这门课在2007年6月有没有开放?有就标记'o',没有标记'x'」,完全贴合「查询各课程每月开课状态」的业务需求。第二段SQL:错误地将「课程ID」与「月份值」做等值匹配
这里的course_id = 200706是把课程ID(取值为1、2、3、4)直接和月份数值(200706等)做相等比较,逻辑变成了「这门课的ID是不是等于200706?」——显然所有课程ID都不可能等于月份值,所以所有列都会返回'x',完全偏离了业务目标。
结果对比
基于给定的测试数据:
- 第一段SQL会返回符合业务预期的结果,正确标记各课程每月的开课状态;
- 第二段SQL的所有列都会返回'x',没有任何实际业务意义。
内容的提问来源于stack exchange,提问作者useryy
相关产品推荐
相关产品推荐

