在SQL查询过程中,我们常常需要根据不同的判断条件返回差异化的结果,比如将学生的考试成绩映射为对应的等级,或者根据用户的消费金额划分用户类型,这类需求可以通过CASE WHEN分支逻辑来实现。
CASE WHEN的基本语法形式
CASE WHEN有两种常用的语法形式,分别是简单CASE表达式和搜索CASE表达式,开发者可以根据实际判断需求选择合适的形式。
简单CASE表达式
简单CASE表达式的语法结构如下,适合判断某个字段的值是否等于多个固定取值的场景:
-- 简单CASE表达式语法
CASE 待判断的字段
WHEN 取值1 THEN 返回结果1
WHEN 取值2 THEN 返回结果2
...
ELSE 默认返回结果
END
下面是将学生成绩等级映射为文字描述的示例,score是存储成绩的字段:
SELECT
student_name,
score,
CASE score
WHEN 90 THEN '优秀'
WHEN 80 THEN '良好'
WHEN 70 THEN '中等'
WHEN 60 THEN '及格'
ELSE '不及格'
END AS score_level
FROM student_score;
搜索CASE表达式
搜索CASE表达式的语法更加灵活,支持使用逻辑运算符判断复杂条件,不需要限定只判断某个字段的固定取值:
-- 搜索CASE表达式语法
CASE
WHEN 条件1 THEN 返回结果1
WHEN 条件2 THEN 返回结果2
...
ELSE 默认返回结果
END
下面是按照成绩区间划分等级的场景,使用搜索CASE表达式实现:
SELECT
student_name,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 70 THEN '中等'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS score_level
FROM student_score;
CASE WHEN的实际应用场景
空值处理
当查询到的字段值为NULL时,可以使用CASE WHEN返回指定的默认值,避免返回NULL影响前端展示:
SELECT
user_id,
user_name,
CASE
WHEN email IS NULL THEN '未填写邮箱'
ELSE email
END AS user_email
FROM user_info;
数据分组统计
可以结合聚合函数使用CASE WHEN实现分组统计,比如统计不同成绩等级的学生人数:
SELECT
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 70 THEN '中等'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS score_level,
COUNT(*) AS student_count
FROM student_score
GROUP BY
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 70 THEN '中等'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END;
使用注意事项
- CASE WHEN表达式最终会返回一个值,需要给这个结果起一个别名,方便后续引用或者展示。
- 条件的判断顺序是从上到下的,只要匹配到第一个符合条件的情况就会返回对应结果,后续的条件不会再判断,因此条件的顺序需要根据业务逻辑合理排列。
- ELSE子句是可选的,如果没有写ELSE,当所有条件都不匹配时,CASE WHEN会返回NULL。
- THEN后面返回的结果数据类型需要保持一致,否则可能会出现类型转换错误或者返回不符合预期的结果。
通过上述示例可以看出,CASE WHEN能够满足绝大多数SQL查询中的条件分支需求,开发者可以根据实际场景灵活选择语法形式,结合业务需求编写合适的查询语句。