SQL里CASE WHEN到底怎么用,有啥实例能帮你理解的那种讲法
- 问答
- 2026-01-18 06:31:21
- 5
说到SQL里的CASE WHEN,你可以把它想象成一个超级智能的“....”机器,它能让你的查询结果不再只是干巴巴地从数据库里原样搬出来,而是可以根据你的想法,变个样子再呈现给你,它不改变数据库里存的任何东西,只是在查询的时候,临时给数据“化个妆”或者“贴个标签”。
最基本的用法:就像做选择题
最标准的CASE WHEN长这样:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 其他结果
END
它的工作流程非常简单:
- 机器从第一条
WHEN条件开始检查。 - 如果
条件1成立(为真),它就立刻返回结果1,后面的看都不看了。 - 如果
条件1不成立,它就继续检查条件2,如果条件2成立,就返回结果2。 - 就这样一个一个条件检查下去,直到找到一个成立的为止。
- 如果所有
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:翻译订单状态
假设有订单表 orders,status 字段用数字表示状态。

| 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加起来,自然就得到了满足条件的数据行数。

实例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等地方,实现非常灵活的数据操作。
你只要记住它就是一个“....”的机器,多结合实际的例子去想象,就很容易理解和掌握了。
本文由畅苗于2026-01-18发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/82878.html
