You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段含不同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:11:50