case when then else_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月`  

两种写法可以得到同样的结果,运行效率差异不大。第二种写法看似代码更加复杂,但是较写法一少了建表、插入数据的步骤。

行转列

假设有下表

f8e0daeb348bd6a3e81c5a334fb08270.png

想转换成下面的样子,该如何写 sql 呢?

0477978e8b54403bcf8d6ca92452e2da.png

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 等聚合函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值