在数据库查询过程中,我们经常会遇到原始数据无法直接满足展示需求的情况,比如数据库存储的用户状态是0和1,而前端需要展示为未激活和已激活;或者成绩字段需要按分数区间转换为优秀、良好、及格等等级。这时候就可以使用SQL的CASE WHEN表达式来修改查询结果的显示格式,让返回的数据更符合业务使用要求。

CASE WHEN基本语法
CASE WHEN有两种常用的语法结构,分别是简单CASE函数和搜索CASE函数,两种结构都可以实现条件判断和格式转换。
简单CASE函数
简单CASE函数的语法结构如下,适合等值判断的场景:
CASE 字段名
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
搜索CASE函数
搜索CASE函数的语法结构如下,支持更复杂的条件判断,比如区间判断、多条件组合判断:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
常见使用场景示例
状态码转文字描述
假设有一张用户表user,其中status字段存储用户状态,0代表未激活,1代表已激活,2代表已禁用,我们需要查询用户列表时直接返回状态的中文描述:
SELECT
id,
username,
CASE status
WHEN 0 THEN '未激活'
WHEN 1 THEN '已激活'
WHEN 2 THEN '已禁用'
ELSE '未知状态'
END AS status_desc
FROM user;
数值区间转换等级
假设有一张成绩表score,其中score字段存储考试分数,需要按以下规则转换等级:分数大于等于90为优秀,80到89为良好,60到79为及格,小于60为不及格:
SELECT
student_id,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 AND score < 90 THEN '良好'
WHEN score >= 60 AND score < 80 THEN '及格'
ELSE '不及格'
END AS level
FROM score;
多条件组合判断
假设订单表order_info中,需要判断订单的紧急程度:如果订单金额大于1000且配送地址是偏远地区,标记为紧急;如果订单金额大于500或者下单时间距离当前不足2小时,标记为普通;其余为常规:
SELECT
order_id,
amount,
address,
create_time,
CASE
WHEN amount > 1000 AND address = '偏远地区' THEN '紧急'
WHEN amount > 500 OR create_time > DATE_SUB(NOW(), INTERVAL 2 HOUR) THEN '普通'
ELSE '常规'
END AS urgency
FROM order_info;
使用注意事项
- CASE WHEN表达式最终会返回一个值,需要给转换后的结果起一个别名,方便后续使用或者展示。
- 条件的判断顺序是从上到下的,只要满足第一个条件,就不会再判断后续的条件,所以条件的顺序需要根据业务逻辑合理排列。
- 如果没有写ELSE子句,当所有条件都不满足时,CASE WHEN会返回NULL,建议根据业务需求加上ELSE默认结果。
- CASE WHEN可以嵌套使用,但是嵌套层级过多会影响SQL的可读性,建议尽量简化逻辑。
与其他函数结合使用
CASE WHEN还可以和其他SQL函数结合使用,比如和聚合函数配合实现分组统计。例如统计用户表中各个状态的人数:
SELECT
CASE status
WHEN 0 THEN '未激活'
WHEN 1 THEN '已激活'
WHEN 2 THEN '已禁用'
ELSE '未知状态'
END AS status_desc,
COUNT(*) AS user_count
FROM user
GROUP BY status_desc;
通过上面的示例可以看出,CASE WHEN是SQL中非常实用的条件判断工具,能够灵活实现查询结果的格式转换,适配不同的业务展示需求,开发者可以根据实际场景选择合适的语法结构来使用。