CASE WHEN 是 SQL 里很实用的条件表达式。它可以把编码转换成展示值,也可以做条件分组、条件聚合、条件更新和一致性检查。用得好,很多报表和清洗逻辑不用搬到应用层。
CASE 有两种写法
简单 CASE 适合对同一个字段做等值判断:
case sex
when '1' then '男'
when '2' then '女'
else '其他'
end
搜索 CASE 适合写复杂条件:
case
when age < 18 then '未成年'
when age >= 18 and age < 60 then '成年人'
else '其他'
end
搜索 CASE 更灵活,可以组合范围、空值、多个字段和函数条件。
CASE 只返回第一个命中的分支
CASE WHEN 会从上往下判断,命中第一个条件后就返回,不会继续看后面的条件。
因此条件顺序很重要。范围更窄、更特殊的条件应该放前面,通用条件放后面。
例如:
case
when code in ('a', 'b') then '第一类'
when code = 'a' then '第二类'
else '其他'
end
这里 code = 'a' 永远不会走到第二类,因为第一条已经命中。
CASE 可以做动态分组
当原始数据没有想要的分类字段时,可以用 CASE 临时映射分组。
select
case
when country in ('中国', '印度', '日本') then '亚洲'
when country in ('美国', '加拿大', '墨西哥') then '北美洲'
else '其他'
end as area,
sum(population) as total_population
from country_population
group by
case
when country in ('中国', '印度', '日本') then '亚洲'
when country in ('美国', '加拿大', '墨西哥') then '北美洲'
else '其他'
end;
这适合报表统计、临时口径和数据探索。长期稳定口径则应该沉淀成维表或明确字段。
条件聚合很适合做统计列
用 sum(case when ... then 1 else 0 end) 可以统计不同条件的数量。
select
sum(case when status = 'success' then 1 else 0 end) as success_count,
sum(case when status = 'failed' then 1 else 0 end) as failed_count
from task_log;
这种写法比多次查询更适合生成横向报表。
格式化函数要注意返回类型
FORMAT、TRUNCATE、CONVERT 等函数可以处理小数展示和类型转换。但要注意:展示格式和计算值不是一回事。
报表展示可以格式化,参与计算时最好保留原始数值,避免字符串格式化后再参与比较或排序。
实用结论
CASE WHEN 是 SQL 里的条件分支工具,适合编码转换、动态分组、条件聚合、条件更新和校验。
写 CASE 时最重要的是顺序、默认分支和语义清晰。短期统计可以放 SQL 里,长期业务规则最好沉淀到字段、维表或应用服务中,避免报表 SQL 越长越难维护。
正文完




