case 表达式作为标准SQL的用法,真的是很强大。
case 表达式分为搜索表达式和简单表达式,由于搜索表达式包含了简单表达式的所有用法,此处仅介绍搜索表达式的用法。
搜索 case 表达式的语法如下:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
上述语句执行时,依次判断 when 表达式是否为真值,是则执行 then 后的语句,如果所有的 when 表达式均为假,则执行 else 后的语句。
之前工作中遇到一个需求,需要将表中的某列进行转换,以得到新的列,当时采用的创建小表,然后再进行内连接的方法。
-- 1.创建临时表,然后内连接的方法
SELECT
`中端1月`.NODE_NAME,
`node_name`.STEP
FROM
`中端1月`
INNER JOIN `node_name` ON `中端1月` .NODE_NAME = `node_name`.NODE_NAME
这个用法也没啥问题,就是需要多创建一个表并写入数据,步骤略微繁琐。最近学习 case 表达式的用法,发现正好可以用来完成此工作。
-- 2.使用 case 表达式的方法
SELECT
`中端1月`.NODE_NAME,
case when `中端1月`.NODE_NAME = '目标制定报告上传' then 'A1'
when `中端1月`.NODE_NAME = '项目启动地市审核' then 'A2'
when `中端1月`.NODE_NAME = '低端工单接收' then 'A3'
when `中端1月`.NODE_NAME = '方案实施' then 'A4'
when `中端1月`.NODE_NAME = '项目结束启动人审核' then 'A5'
when `中端1月`.NODE_NAME = '项目结束地市审核' then 'A6'
when `中端1月`.NODE_NAME = '新建中端工单' then 'A1'
when `中端1月`.NODE_NAME = '中端工单接收' then 'A3'
ELSE NULL
END AS STEP
FROM
`中端1月`
两种写法可以得到同样的结果,运行效率差异不大。第二种写法看似代码更加复杂,但是较写法一少了建表、插入数据的步骤。
假设有下表
想转换成下面的样子,该如何写 sql 呢?
case when 表达式 + 聚合函数可以实现行转列
-- case when 实现数字列 score 行转列
select name,
sum(case when subject = '语文' then score else null end) as chinese,
sum(case when subject = '数学' then score else null end) as math,
sum(case when subject = '外语' then score else null end) as english
from score
group by name;
+------+---------+------+---------+
| name | chinese | math | english |
+------+---------+------+---------+
| 张三 | 93 | 88 | 91 |
| 李四 | 87 | 90 | 77 |
+------+---------+------+---------+
2 rows in set (0.00 sec)
-- case when 实现文本列 subject 行转列
select name,
max(case when subject = '语文' then subject else null end) as chinese,
max(case when subject = '数学' then subject else null end) as math,
min(case when subject = '外语' then subject else null end) as english
from score
group by name;
+------+---------+------+---------+
| name | chinese | math | english |
+------+---------+------+---------+
| 张三 | 语文 | 数学 | 外语 |
| 李四 | 语文 | 数学 | 外语 |
+------+---------+------+---------+
2 rows in set (0.00 sec)
总结:
sum avg max min
等聚合函数;max min
等聚合函数