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;
结果:
CASE表达式可以写在任意位置。
可以使用CASE表达式进行行列转换,什么意思呢?
假如要按照商品种类计算出的销售单价合计值,我们首先想到的是使用group by,按照商品种类分组后计算单价和,这样得到的结果会以“行”的形式输出,而无法以列的形式进行排列。
如:
执行结果如下:
使用CASE表达式进行行列转换
在满足商品种类(product_type )为“衣服”或者“办公用品”等特定值时,上述 CASE 表达式输出该商品的销售单价(sale_price ),不满足时输出 0。对该结果进行汇总处理,就能够得到特定商品种类的销售单价合计值了。
执行结果如下:
简单CASE表达式
简单 CASE 表达式比搜索 CASE 表达式简单,但是会受到条件的约束,因此通常情况下都会使用搜索 CASE 表达式。
简单CASE表达式语法:
两者对比:
像“CASE product_type ”这样,简单 CASE 表达式在将想要求值的表达式(这里是列)书写过一次之后,就无需在之后的 WHEN 子句中重复书写“product_type ”了。虽然看上去简化了书写,但是想要在 WHEN 子句中指定不同列时,简单 CASE 表达式就无能为力了。
参考:https://blog.csdn.net/abbeylasi/article/details/105667443