在处理数据时,我们经常需要根据不同的条件来决定显示或计算哪些值。例如:
- 根据分数段给学生评分等级;
- 按照订单金额划分客户级别;
- 对某些特定值进行重命名或分类。
这时候,我们就需要用到 SQL 中非常强大的一个关键字 —— CASE
!
它允许我们在查询中实现类似于编程语言中的条件判断(如 if-else
),从而让查询结果更加灵活和智能。
一、什么是 CASE?
CASE
是 SQL 中用于实现条件逻辑的关键字。它可以根据指定的条件返回不同的值,非常适合用来进行数据分类、转换等操作。
你可以把它理解为:“如果满足这个条件,则返回某个值;否则返回另一个值”。
case when的正确语法是: case when ... then ... when ... then ... else ... end,case和end不能缺少。
二、基本语法
SQL 提供了两种形式的 CASE
表达式:
简单 CASE 表达式
CASE input_expression
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
ELSE default_result
END
- 当
input_expression
等于某个expression
时,返回对应的result
。 - 如果没有匹配项,则返回
ELSE
后面的默认值。
搜索 CASE 表达式
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
- 可以使用任意的布尔表达式作为条件。
- 返回第一个满足条件的结果,如果没有条件满足,则返回
ELSE
后面的默认值。
三、示例讲解
假设我们有一个 students
表,记录了学生的考试成绩:
id | name | score |
---|---|---|
1 | 张三 | 85 |
2 | 李四 | 90 |
3 | 王五 | 70 |
4 | 赵六 | 50 |
示例1:简单 CASE 表达式 - 根据分数划分等级
SELECT name, score,
CASE score
WHEN 90 THEN '优秀'
WHEN 80 THEN '良好'
WHEN 70 THEN '合格'
ELSE '不合格'
END AS grade
FROM students;
结果:
name | score | grade |
---|---|---|
张三 | 85 | NULL |
李四 | 90 | 优秀 |
王五 | 70 | 合格 |
赵六 | 50 | 不合格 |
注意:在这个例子中,因为张三的成绩是85分,并不直接等于任何一个 WHEN
分支的值,所以他的等级显示为 NULL
。
示例2:搜索 CASE 表达式 - 更灵活的条件判断
SELECT name, score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '合格'
ELSE '不合格'
END AS grade
FROM students;
结果:
name | score | grade |
---|---|---|
张三 | 85 | 良好 |
李四 | 90 | 优秀 |
王五 | 70 | 合格 |
赵六 | 50 | 不合格 |
使用搜索 CASE
表达式可以更灵活地处理范围条件。
示例3:结合聚合函数使用
假设我们有一个 orders
表,记录了订单信息:
order_id | customer_id | amount |
---|---|---|
1 | 1 | 2999 |
2 | 2 | 499 |
3 | 1 | 199 |
4 | 3 | 899 |
我们可以用 CASE
来统计每个客户的订单总额,并根据金额划分客户级别:
SELECT customer_id,
SUM(amount) AS total_amount,
CASE
WHEN SUM(amount) > 1000 THEN '高级客户'
WHEN SUM(amount) BETWEEN 500 AND 1000 THEN '中级客户'
ELSE '普通客户'
END AS customer_level
FROM orders
GROUP BY customer_id;
结果:
customer_id | total_amount | customer_level |
---|---|---|
1 | 3198 | 高级客户 |
2 | 499 | 普通客户 |
3 | 899 | 中级客户 |
注意
CASE
表达式必须包含至少一个WHEN
子句,并且通常包含一个ELSE
子句来处理未匹配的情况。- 在性能方面,尽量使
CASE
表达式的条件尽可能具体,避免过多的嵌套,以免影响查询效率。 CASE
可以与SELECT
,WHERE
,ORDER BY
等子句一起使用,增加查询的灵活性。
四、总结对比表
场景 | SQL 示例 |
---|---|
根据具体值划分等级 | CASE score WHEN 90 THEN '优秀' ... END |
根据条件范围划分等级 | CASE WHEN score >= 90 THEN '优秀' ... END |
结合聚合函数使用 | SELECT customer_id, SUM(amount), CASE WHEN ... END FROM orders GROUP BY customer_id; |