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
等聚合函数
- silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法
- find命令小结
- Python加圣诞帽
- 多次grep 没有看到输出
- java多线程 基础demo
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- mybatis 使用tips - 使用多个参数
- 从高的角度看自动化测试
- Django中请求的生命周期
- 程序猿python学习AIphaZero,TensorFlow强化学习AI游戏,100行代码运行看看!
- awk中NF的使用
- tar.gz 解压
- Python&机器学习之项目实践
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【拓展】745- Windows Server 升级 HTTPS 实战
- 【Web技术】746- VSCode 插件开发入门教程
- Python实现ARMA模型
- SpringMVC笔记
- JAVA入门学习五
- ECMAScript 6新特性简介
- Python 多维数据可视化
- 探究Compound治理及构建治理界面
- python之unittest框架实现接口测试的一个简单实例
- linux提权-Suid和Guid配置错误
- Git快速学习
- Spring笔记
- ARL灯塔最新版本2.1,现在它来了,快来看看盒子带来了什么有趣的更新
- 渗透测试常规操作记录(下)
- IntelliJ IDEA 2020.2激活破解教程