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 @ 2022-05-11 20:09  捷后愚生  阅读(517)  评论(0编辑  收藏  举报