一、CASE表达式
1.简单表达式和搜索表达式
类似功能:DECODE(Oracle)、IF (MySQL)
分为简单CASE表达式和搜索CASE表达式
--简单CASE表达式和搜索CASE表达式
--simple case expression
case sex
when '1' then 'man'
when '2' then 'woman'
else 'else' end
--searched case expression
case when sex = '1' then 'man'
when sex = '2' then 'woman'
else 'else' end
执行结果相同,搜索表达式实现范围较大,一般使用搜索表达式
注:发现为真的when子句时,CASE表达式的真假值判断会中止,剩余的when子句会被忽略,
注意when子句的排他性
--when子句被忽略的写法(不论输入值是a或b,都是frist)
case when col_1 in ('a', 'b') then 'frist'
when col_2 in ('a') then 'second'
else 'else' end
2.将已有编号方式转换为新的方式并统计
在进行非定制化统计时,我们经常会遇到将已有编号方式转换为另外一种便于分析的方式并进行统计的需求。
例如,现在有一张按照“‘1:北海道’、‘2:青森’、……、‘47:冲绳’”这种编号方式来统计都道府县 2 人口的表,我们需要以东北、关东、九州等地区为单位来分组,并统计人口数量。具体来说,就是统计下表 PopTbl 中的内容,得出如右表“统计结果”所示的结果。
--使用case表达式
select case pref_name
when '德岛' then '四国'
when '香川' then '四国'
when '爱媛' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else 'else' end as district,
sum(population)
from popTbl
group by7 case pref_name
when '德岛' then '四国'
when '香川' then '四国'
when '爱媛' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else 'else' end
如果对转换前的列“pref_name ”进行 GROUP BY ,就得不到正确的结果
要按人口数量等级(pop_class )查询都道府县个数的时候,就可以像下面这样写 SQL 语句。
-- 按人口数量等级划分都道府县
SELECT CASE WHEN population < 100 THEN '01'
WHEN population >= 100 AND population < 200 THEN '02'
WHEN population >= 200 AND population < 300 THEN '03'
WHEN population >= 300 THEN '04'
ELSE NULL END AS pop_class,
COUNT(*) AS cnt
FROM PopTbl
GROUP BY CASE WHEN population < 100 THEN '01'
WHEN population >= 100 AND population < 200 THEN '02'
WHEN population >= 200 AND population < 300 THEN '03'
WHEN population >= 300 THEN '04'
ELSE NULL END;
--结果
pop_class cnt
--------- ----
01 1
02 3
03 3
04 2
必须在 SELECT 子句和 GROUP BY 子句这两处写一样的 CASE 表达式较为麻烦,可更改为下述写法
但是严格来说,这种写法是违反标准 SQL 的规则的。
GROUP BY 子句比 SELECT 语句先执行,在 GROUP BY 子句中引用在 SELECT 子句里定义的别称不被允许
在 Oracle、DB2、SQL Server 等数据库里采用这种写法时就会出错。
在 PostgreSQL 和MySQL 中,这个查询语句就可以顺利执行。
-- 把县编号转换成地区编号(2) :将CASE 表达式归纳到一处
SELECT CASE pref_name WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END AS district,
SUM(population)
FROM PopTbl
GROUP BY district; ←-------GROUP BY 子句里引用了SELECT 子句中定义的别名
3.用一条 SQL 语句进行不同条件的统计
进行不同条件的统计是 CASE 表达式的著名用法之一。
例如,我们需要往存储各县人口数量的表 PopTbl 里添加上“性别”列,然后求按性别、县名汇总的人数。具体来说,就是统计表 PopTbl2 中的数据,然后求出如表“统计结果”所示的结果。
SELECT pref_name,
-- 男性人口
SU