sql 之 case 表达式

什么是 CASE 表达式

什么是 CASE 表达式?简单来说,就是条件表达式。从SQL-92标准开始引入,常用作条件分支,不依赖于具体数据库的技术,可以提高SQL代码的可移植性。

CASE 表达式是标准 SQL 所承认的功能,因此在任何 DBMS 中都可以执行。但是,有些 DBMS 还提供了一些特有的 CASE 表达式的简化函数,例如 Oracle 中的 DECODE、MySQL 中的 IF等,这些都不是通用的,建议记住 CASE 表达式的用法即可。

CASE 表达式分为简单CASE 表达式和搜索CASE 表达式两种。搜索CASE 表达式包含简单CASE表达式的全部功能。

搜索CASE表达式

CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.. .
ELSE <表达式>
END

CASE 表达式从第一个WHEN子句中的< 求值表达式>进行求值开始执行,如果结果为真,就返回THEN子句中的表达式,剩余的WHEN子句被忽略,CASE表达式的执行结束。
如果结果不为真,就跳转到下一条WHEN子句的求值中。
如果直到最后的WHEN子句为止返回结果都不为真,就返回ELSE中的表达式,执行结束。

-- 剩余的WHEN子句被忽略的用法例子
-- 结果不会出现“第二”
CASE WHEN col_1 IN('a', 'b') THEN '第一'
WHEN col_1 IN('a') THEN '第二'
ELSE '其他' END;
  • WHEN子句中的< 求值表达式>类似where后面的表达式,如列 = 值、in/no in
  • ELSE子句指定应该如何处理不满足WHEN子句中的条件的记录,NULL之外的其他值或者表达式都可以写在ELSE子句中。如果省略不写,默认为ELSE NULL
  • 需要统一各分支返回的数据类型
  • 最后的“END”不能省略
  • ELSE子句是可选的。不写ELSE子句时,CASE 表达式的执行结果是NULL。但不写可能会发生“语法没有错误,结果却不对”错误,所以建议写上ELSE子句

示例:

-- 通过CASE表达式将A 、B、C的字符串加入到商品种类当中
SELECT product_name,
CASE WHEN product_type = '衣服' THEN CONCAT('A :' ,product_type)
WHEN product_type = '办公用品' THEN CONCAT('B :' ,product_type)
WHEN product_type = '厨房用具' THEN CONCAT('C :' ,product_type)
ELSE NULL
END AS abc_product_type
FROM Product;

结果:
image

CASE表达式可以写在任意位置。
可以使用CASE表达式进行行列转换,什么意思呢?
假如要按照商品种类计算出的销售单价合计值,我们首先想到的是使用group by,按照商品种类分组后计算单价和,这样得到的结果会以“行”的形式输出,而无法以列的形式进行排列。
如:
image

执行结果如下:
image

使用CASE表达式进行行列转换
image

在满足商品种类(product_type )为“衣服”或者“办公用品”等特定值时,上述 CASE 表达式输出该商品的销售单价(sale_price ),不满足时输出 0。对该结果进行汇总处理,就能够得到特定商品种类的销售单价合计值了。

执行结果如下:
image

简单CASE表达式

简单 CASE 表达式比搜索 CASE 表达式简单,但是会受到条件的约束,因此通常情况下都会使用搜索 CASE 表达式。
简单CASE表达式语法:
image
两者对比:
image
像“CASE product_type ”这样,简单 CASE 表达式在将想要求值的表达式(这里是列)书写过一次之后,就无需在之后的 WHEN 子句中重复书写“product_type ”了。虽然看上去简化了书写,但是想要在 WHEN 子句中指定不同列时,简单 CASE 表达式就无能为力了。


参考:https://blog.csdn.net/abbeylasi/article/details/105667443

posted @   捷后愚生  阅读(528)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-05-11 虚拟机乌班图系统安装 VMware tools 工具
2020-05-11 ubuntu中如何切换普通用户、root用户
2020-05-11 在Ubuntu18.04安装docker之后,以登陆用户身份执行docker pull jenkins,报错:connect: permission denied
2020-05-11 安装VM-TOOLS,解压tar包时提示目录磁盘空间不足
2020-05-11 超详细的VMware安装ubuntu教程
点击右上角即可分享
微信分享提示