SQL中的CASE函数是一种条件表达式,允许在查询语句中根据指定条件返回不同的结果,相当于其他编程语言里的if-else逻辑,能够灵活处理各类条件判断需求,广泛应用于字段值转换、分组统计、数据清洗等场景。

CASE函数的基础语法
CASE函数有两种常用的语法形式,分别是简单CASE表达式和搜索CASE表达式,适用不同的条件判断场景。
简单CASE表达式
简单CASE表达式用于等值判断,语法结构如下:
CASE 字段名
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
这种形式会逐个判断字段的值是否等于后面指定的值,匹配到第一个符合条件的结果就返回,如果都不匹配则返回ELSE后面的默认结果,没有ELSE的话返回NULL。
搜索CASE表达式
搜索CASE表达式支持更复杂的条件判断,比如范围判断、多字段组合判断等,语法结构如下:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
这种形式会按顺序判断每个WHEN后面的条件是否成立,第一个成立的条件对应的结果会被返回,同样如果所有条件都不成立,返回ELSE的结果或者NULL。
CASE函数的常见使用场景
单条件字段值映射
比如有一张用户表user,里面有gender字段,存储的是1和0,分别表示男性和女性,查询时可以用CASE函数把值转换成可读的文字:
SELECT
user_id,
user_name,
CASE gender
WHEN 1 THEN '男性'
WHEN 0 THEN '女性'
ELSE '未知'
END AS gender_desc
FROM user;
多条件范围判断
比如有一张学生成绩表score,需要根据分数划分等级,90分及以上为优秀,80到89分为良好,60到79分为及格,60分以下为不及格,用搜索CASE表达式实现:
SELECT
student_id,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS score_level
FROM score;
分组统计场景
可以用CASE函数结合聚合函数实现自定义分组统计,比如统计用户表中不同性别的用户数量:
SELECT
CASE gender
WHEN 1 THEN '男性'
WHEN 0 THEN '女性'
ELSE '未知'
END AS gender_type,
COUNT(*) AS user_count
FROM user
GROUP BY gender_type;
嵌套使用CASE函数
当条件逻辑比较复杂时,可以在CASE函数的结果部分再嵌套CASE函数,比如先判断用户是否成年,再判断性别:
SELECT
user_id,
user_name,
CASE
WHEN age >= 18 THEN
CASE gender
WHEN 1 THEN '成年男性'
WHEN 0 THEN '成年女性'
ELSE '成年未知性别'
END
ELSE '未成年'
END AS user_type
FROM user;
使用CASE函数的注意事项
- CASE函数必须以END结尾,否则会报语法错误。
- THEN后面返回的结果数据类型最好保持一致,否则可能出现隐式类型转换,影响查询性能或者结果准确性。
- 条件的判断顺序是从上到下的,第一个匹配的条件会被执行,所以要注意条件的排列顺序,避免逻辑错误。
- CASE函数可以用在SELECT、WHERE、ORDER BY、GROUP BY等子句中,灵活适配不同的查询需求。
总结
CASE函数是SQL中实现条件逻辑的重要工具,两种语法形式分别适配等值判断和复杂条件判断的场景,通过不同的使用方式可以满足字段映射、范围判断、分组统计等多种需求。掌握CASE函数的用法,能够大幅提升SQL查询的灵活性,减少不必要的多次查询或者应用层处理逻辑,提升开发效率。