CASE 表达式
-- 简单CASE表达式
CASE sex
WHEN '1' THEN '男'
WHEN '0' THEN '女'
ELSE '武装直升机' END
-- 搜索CASE表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '0' THEN '女'
ELSE '武装直升机' END
注意:
- 各分支返回统一的数据类型
- 不要忘记写 END
- 养成写 ELSE 语句的习惯
应用
数据重分组
-- 把区编号转换成地区编号
SELECT CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END AS 地区名,
SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END;
行列转换
SELECT pref_name,
-- 男性人口
SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
-- 女性人口
SUM( CASE THEN sex = '0' THEN population ELSE 0 END) AS cnt_f
FROM PopTbl2
GROUP BY pref_name;
结合CHECK约束
某公司规定“女性员工的工资必须在 20 万日元以下
蕴含式 P → Q P \rightarrow Q P→Q
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary <= 200000
THEN 1 ELSE 0 END)
ELSE 1 END = 1 )
注意对比 逻辑与 P ^ Q
CONSTRAINT check_salary CHECK
( SEX = '2' AND salary <= 200000)
UPDATE 语句使用条件分支
UPDATE Salaries
SET salary = CASE WHEN salary >= 300000
THEN salary * 0.9
WHEN salary >= 250000 AND salary < 280000
THEN salary * 1.2
ELSE salary END;
表间数据匹配
-- 表匹配: 使用IN谓词
SELECT course_name,
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHEN month = 200706) THEN 'O'
ELSE 'X' END AS '六月',
...
FROM CourseMaster;
-- 表匹配: 使用EXIST谓词
SELECT course_name,
CASE WHEN EXIST
(SELECT course_id FROM OpenCourses OC
WHEN month = 200706 AND CM.course_id = OC.course_id) THEN 'O'
ELSE 'X' END AS '六月',
...
FROM CourseMaster CM;
CASE中使用聚合函数
获取只加入一个社团的学生的社团 ID 和 加入多个社团的学生的主社团 ID。
SELECT std_id,
CASE WHEN COUNT(*) = 1
THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = 'Y'
THEN club_id
ELSE NULL END)
END AS main_club
FROM StuedentClub
GROUP BY std_id;
《SQL进阶教程》