mysql中的case when有两种写法:
- 简单函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
- 搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
简单函数
针对一个字段来进行枚举,把可能的值的定义结果来重新放到一列,下面user_group表
id | name |
1 | 张三 |
2 | 李四 |
3 | 王五 |
4 | 朱六 |
select `name`, CASE name
WHEN '张三' THEN
'第一组'
WHEN '李四' THEN
'第二组'
ELSE
'第三组'
END 'group' FROM user_group;
得到的结果如下表
name | group |
张三 | 第一组 |
李四 | 第二组 |
王五 | 第三组 |
朱六 | 第三组 |
搜索函数
case语句允许在when下根据判断语句,在结果内对值进行替换,下面user_age表
id | name | age |
1 | 名字1 | 3 |
2 | 名字2 | 16 |
3 | 名字3 | 21 |
4 | 名字4 | 29 |
5 | 名字5 | 31 |
6 | 名字6 | 56 |
7 | 名字7 | 63 |
select `name`,age,CASE
WHEN age<18 THEN
'少年'
WHEN age>=18 and age<30 THEN
'青年'
WHEN age>=30 and age<50 THEN
'中年'
ELSE
'老年'
END stage from user_age;
结果:
name | age | stage |
名字1 | 3 | 少年 |
名字2 | 16 | 少年 |
名字3 | 21 | 青年 |
名字4 | 29 | 青年 |
名字5 | 31 | 中年 |
名字6 | 56 | 老年 |
名字7 | 63 | 老年 |
除了进行基础的判断用法外,他还可以用作行转列操作。按照上面得到的结果来插入到一个user_stage表中,现在有个需求,把stage中的每个阶段当做一个单独的字段来进行统计每个阶段的人数。
select
SUM(CASE stage
WHEN '少年' THEN
1
ELSE
0
END) '少年',
SUM(CASE stage
WHEN '青年' THEN
1
ELSE
0
END) '青年',
SUM(CASE stage
WHEN '中年' THEN
1
ELSE
0
END) '中年',
SUM(CASE stage
WHEN '老年' THEN
1
ELSE
0
END) '老年'
from user_stage
其实这个方法并不好,有更简单的方法实现,但是在这里只做演示,结果:
少年 | 青年 | 中年 | 老年 |
2 | 2 | 1 | 2 |