专栏首页datartisanSQL中CASE表达式的妙用

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

本文分享自微信公众号 - 乐享数据8090(gh_5703273a0562),作者:mba1398

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python打包利器:auto-py-to-exe

    auto-py-to-exe 是一个用于将Python程序打包成可执行文件的图形化工具。本文就是主要介绍如何使用 auto-py-to-exe 完成 pytho...

    披头
  • pandas踩过的坑 | 记一个群友的提问

    群里的每一次提问,都是一次面试,如果可以,我都会尝试解答。这里只晒了一张图,没有上下文,我提示代码不全,小伙伴后来补充了相关代码和报错:

    披头
  • PowerBI在通信行业中的应用-经纬度集合转化为道路折线图

    10、将步骤5生成的文件的ROUTEID列内容复制到notepad++,不要表头,文件后缀修改为mid

    披头
  • 面试重灾区之原子操作你有必要了解下

    在JDK1.5+的版本中,Doug Lea和他的团队还为我们提供了一套用于保证线程安全的原子操作。我们都知道在多线程环境下,对于更新对象中的某个属性、更新基本类...

    黄泽杰
  • Akka(31): Http:High-Level-Api,Route rejection handling

       Route 是Akka-http routing DSL的核心部分,使用户能比较方便的从http-server的角度筛选http-request、进行se...

    用户1150956
  • 算法工程师-SQL进阶:强大的Case表达式

    相信大家对SQL都非常熟悉了,可能有些小伙伴会有疑问,算法工程师不是跑模型的吗?还需要学SQL?其实,很有必要!原因大概有以下几点吧:

    小萌哥
  • Retrofit解析6之面向接口编程

    1、解析思路 2、Call接口 3、CallAdapter接口 4、Callback接口 5、Converter接口 6、ExecutorCallAd...

    隔壁老李头
  • java设计模式之代理模式,看我72

    代理模式(Proxy Pattern)一个类代表另一个类的功能,通过代理对象访问目标对象,可以在目标对象实现的基础上,增强额外的功能。

    用户4361942
  • DokuWiki引擎

    DokuWiki 是一个使用,用途多样的开源 Wiki 软件,并且不需要数据库。它因简洁易读的语法受到用户的喜爱。而容易维护、备份和整合则使它成为管理员的最爱。...

    八十岁的背影
  • 【Jetson开发项目展示】利用Jetson NANO和TensorRT做一个道路智能坑洞检测器

    随着社会经济的发展,汽车已经成为人们不可或缺的代步工具。然而由于汽车数量的大幅度增加,以及道路未及时养护,产生了大量严重损毁的道路。而这些损毁状况严重的路面对驾...

    GPUS Lady

扫码关注云+社区

领取腾讯云代金券