MySQL CASE WHEN 怎么用:条件分组、聚合和格式化片段

1次阅读
没有评论

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;

这种写法比多次查询更适合生成横向报表。

格式化函数要注意返回类型

FORMATTRUNCATECONVERT 等函数可以处理小数展示和类型转换。但要注意:展示格式和计算值不是一回事。

报表展示可以格式化,参与计算时最好保留原始数值,避免字符串格式化后再参与比较或排序。

实用结论

CASE WHEN 是 SQL 里的条件分支工具,适合编码转换、动态分组、条件聚合、条件更新和校验。

写 CASE 时最重要的是顺序、默认分支和语义清晰。短期统计可以放 SQL 里,长期业务规则最好沉淀到字段、维表或应用服务中,避免报表 SQL 越长越难维护。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-07-05发表,共计1229字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)