SQL中CASE表达式的妙用

时间:2022-07-23
本文章向大家介绍SQL中CASE表达式的妙用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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 等聚合函数