概述
在数据库中,CASE表达式可以用于在查询语句中进行条件判断和结果返回。可以用于SELECT查询中的字段表达式、ORDER BY子句、WHERE子句等多个场景中,以根据不同的条件返回不同的结果。
它可以对数据库中的数据进行灵活的条件判断和处理,常用于根据不同的条件返回计算字段、分类汇总数据、动态排序等操作,但是,CASE表达式真正的价值却并不怎么为人所知。
基本语法
case表达式有两种写法,分别是简单CASE表达式和搜索CASE表达式 语法如下:
--简单CASE表达式
CASE sex
WHEN '1' THEN ’男’
WHEN '2' THEN ’女’
ELSE ’其他’ END
--搜索CASE表达式
CASE WHEN sex ='1'THEN’男’
WHEN sex ='2'THEN’女’
ELSE ’其他’ END
简单CASE表达式正如其名,写法简单,但能实现的事情比较有限。简单CASE表达式能写的条件,搜索CASE表达式也能写,所以基本上采用搜索CASE表达式的写法。
搜索CASE表达式更加强大和灵活,when后边还可以跟sql查询语句。需要注意的是,在发现为真的WHEN子句时,CASE表达式的真假值判断就会中止,而剩余的WHEN子句会被忽略。为了避免引起不必要的混乱,使用WHEN子句时要注意条件的排他性。
注意事项
使用CASE表达式的时候,还需要注意以下几点。
- 注意事项1:统一各分支返回的数据类型
- 注意事项2:不要忘了写END
- 注意事项3:养成写ELSE子句的习惯
应用案例
总结一些非常少见但很实用的场景案例,比如:将已有编号方式转换为新的方式并统计,用一条SQL语句进行不同条件的统计,用CHECK约束定义多个列的条件关系 等等。
将已有编号方式转换为新的方式并统计
比如有一张订单表,订单的商品有手机,电脑,苹果等等,如果需要把某些商品的订单按照电子产品和水果两类分类进行统计,就需要将已有编号方式转换为新的方式并统计,语句如下:
SELECT CASE o.product_name
WHEN '华为手机' THEN
'电子产品'
WHEN '苹果手机' THEN
'电子产品'
WHEN '苹果' THEN
'水果'
WHEN '香蕉' THEN
'水果'
ELSE
'其它'
END pro_type, SUM(o.order_amount) AS total_amount
FROM cw_cou o
GROUP BY CASE o.product_name
WHEN '华为手机' THEN
'电子产品'
WHEN '苹果手机' THEN
'电子产品'
WHEN '苹果' THEN
'水果'
WHEN '香蕉' THEN
'水果'
ELSE
'其它'
END
统计结果:
pro_type total_amount
电子产品 16000.00
水果 50.00
这里的关键在于将SELECT子句里的CASE表达式复制到GROUP BY子句里,必须在SELECT子句和GROUP BY子句这两处写一样的CASE表达式,固定写法。
还可以使用搜索CASE表达式,将数值按照适当的级别进行分类统计,统计语句如下:
SELECT CASE
WHEN o.order_amount > 6500 THEN
'a'
WHEN o.order_amount <= 6000
AND o.order_amount >= 4000 THEN
'b'
WHEN o.order_amount <= 50
AND o.order_amount >= 10 THEN
'c'
ELSE
NULL
END as pro_level, SUM(o.order_amount) AS total_amount
FROM tb_order o
GROUP BY CASE
WHEN o.order_amount > 6500 THEN
'a'
WHEN o.order_amount <= 6000
AND o.order_amount >= 4000 THEN
'b'
WHEN o.order_amount <= 50
AND o.order_amount >= 10 THEN
'c'
ELSE
NULL
END
下一章节见。