当前位置:首页 > 问答 > 正文

SQL里CASE WHEN到底怎么用,有啥实例能帮你理解的那种讲法

说到SQL里的CASE WHEN,你可以把它想象成一个超级智能的“....”机器,它能让你的查询结果不再只是干巴巴地从数据库里原样搬出来,而是可以根据你的想法,变个样子再呈现给你,它不改变数据库里存的任何东西,只是在查询的时候,临时给数据“化个妆”或者“贴个标签”。

最基本的用法:就像做选择题

最标准的CASE WHEN长这样:

CASE
    WHEN 条件1 THEN 结果1
    WHEN 条件2 THEN 结果2
    ...
    ELSE 其他结果
END

它的工作流程非常简单:

  1. 机器从第一条WHEN条件开始检查。
  2. 如果条件1成立(为真),它就立刻返回结果1,后面的看都不看了。
  3. 如果条件1不成立,它就继续检查条件2,如果条件2成立,就返回结果2
  4. 就这样一个一个条件检查下去,直到找到一个成立的为止。
  5. 如果所有WHEN条件都不成立,它就返回ELSE后面指定的“其他结果”,如果你没写ELSE部分,那它就返回NULL(空值)。

实例1:给学生成绩打等级

假设你有一个学生成绩表 student_scores,里面有学生姓名(name)和分数(score)。

name score
张三 85
李四 92
王五 76
赵六 58

老板不想看具体的分数,只想看优良中差四个等级,规则是:90分以上优,80-89良,60-79中,60分以下差。

用CASE WHEN就能轻松搞定:

SELECT
    name,
    score,
    CASE
        WHEN score >= 90 THEN '优'
        WHEN score >= 80 THEN '良' -- 注意:能走到这里说明分数肯定小于90了
        WHEN score >= 60 THEN '中'
        ELSE '差'
    END AS grade_level
FROM student_scores;

查询结果就会变成:

name score grade_level
张三 85
李四 92
王五 76
赵六 58

看,我们成功地把冰冷的数字变成了有意义的等级标签,这里的AS grade_level是给这个用CASE WHEN生成的新列起了一个别名,叫“grade_level”。

另一种简写形式:对付单个字段的精准匹配

如果你的条件都是针对同一个字段,判断它是否等于某个值,比如像是枚举值(像订单状态:1待支付、2已支付、3已发货),有一种更简洁的写法:

CASE 字段名
    WHEN 值1 THEN 结果1
    WHEN 值2 THEN 结果2
    ...
    ELSE 其他结果
END

实例2:翻译订单状态

假设有订单表 ordersstatus 字段用数字表示状态。

SQL里CASE WHEN到底怎么用,有啥实例能帮你理解的那种讲法

order_id status
1001 1
1002 2
1003 3

我们可以用简写形式把状态码“翻译”成中文:

SELECT
    order_id,
    CASE status
        WHEN 1 THEN '待支付'
        WHEN 2 THEN '已支付'
        WHEN 3 THEN '已发货'
        ELSE '未知状态'
    END AS status_desc
FROM orders;

结果:

order_id status_desc
1001 待支付
1002 已支付
1003 已发货

这种写法比用WHEN status = 1 THEN ... 要简洁一些,但要注意,它只能处理等值判断,不如第一种标准写法灵活(比如处理分数区间那种)。

CASE WHEN 的高级玩法:用在任何地方

CASE WHEN 的强大之处在于,它几乎可以出现在SQL语句的任何一个子句里,不仅仅是SELECT后面。

实例3-1:配合SUM函数,实现按条件计数

你想统计上面成绩表中,优、良、中、差每个等级分别有多少人,你不需要写复杂的子查询,用CASE WHEN inside SUM就能实现。

SELECT
    COUNT(*) AS total_students, -- 总人数
    SUM( CASE WHEN score >= 90 THEN 1 ELSE 0 END ) AS excellent_count, -- 优的人数
    SUM( CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END ) AS good_count, -- 良的人数
    SUM( CASE WHEN score >= 60 AND score < 80 THEN 1 ELSE 0 END ) AS medium_count, -- 中的人数
    SUM( CASE WHEN score < 60 THEN 1 ELSE 0 END ) AS poor_count -- 差的人数
FROM student_scores;

这个语句的原理是:里面的CASE WHEN会为每一行数据生成一个值,如果条件满足就是1,不满足就是0,外面的SUM函数就把所有这些1和0加起来,自然就得到了满足条件的数据行数。

SQL里CASE WHEN到底怎么用,有啥实例能帮你理解的那种讲法

实例3-2:用在ORDER BY后面,实现自定义排序

假设你想把学生成绩表按等级排序,但顺序不是从高到低,而是你想让“中”排在最前面,然后是“良”,然后是“优”,最后是“差”,用普通的ORDER BY score是做不到的,这时可以用CASE WHEN来生成一个排序用的数字。

SELECT
    name,
    score,
    CASE
        WHEN score >= 90 THEN '优'
        WHEN score >= 80 THEN '良'
        WHEN score >= 60 THEN '中'
        ELSE '差'
    END AS grade_level
FROM student_scores
ORDER BY
    CASE grade_level -- 注意:这里用的是上面生成的别名
        WHEN '中' THEN 1
        WHEN '良' THEN 2
        WHEN '优' THEN 3
        ELSE 4
    END;

结果就会按照我们设定的奇怪顺序排列了。

实例3-3:用在UPDATE语句里,智能更新数据

CASE WHEN 也能用来更新数据,老板说为了鼓励学生,给每个同学加5分“鼓励分”,但最高分不能超过100分。

UPDATE student_scores
SET score = CASE
                WHEN score <= 95 THEN score + 5 -- 如果加分后不超过100,就加
                ELSE 100 -- 如果原分数96分以上,加分后会超100,就直接设为100
            END;

这个UPDATE语句就会智能地更新每一行的分数。

总结一下

SQL里的CASE WHEN就是一个条件判断器,它的核心思想就是“..就...否则如果...就...”。

  • 基础用法是给数据贴上新标签,让查询结果更易读。
  • 高级用法是把它嵌入到SUM、COUNT等聚合函数里,实现复杂统计;或者用在ORDER BY、UPDATE、WHERE等地方,实现非常灵活的数据操作。

你只要记住它就是一个“....”的机器,多结合实际的例子去想象,就很容易理解和掌握了。