1-1 case
概述
-- 简单CASE 表达式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- 搜索CASE 表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
行列转换
重新分组
-- 把县编号转换成地区编号(1)
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 CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END;
注意!group by 语句中需要复制select 子句中的case表达式
也可以重命名后 在group by 后直接跟别名district
与约束结合
用check 约束定义多个列的条件关系
某公司规定“女性员工的工资必须在 20 万日元以下”,
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary <= 200000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
在这段代码里,CASE 表达式被嵌入到 CHECK 约束里,描述了“如果
是女性员工,则工资是 20 万日元以下”这个命题。在命题逻辑中,该
命题是叫作蕴含式(conditional)的逻辑表达式,记作 P → Q。
在 UPDATE 语句里进行条件分支
- 对当前工资为 30 万日元以上的员工,降薪 10%。
- 对当前工资为 25 万日元以上且不满 28 万日元的员工,加薪
20%。
当一个人满足第一个条件之后降薪,可能会满足第二个条件
-- 用CASE 表达式写正确的更新操作
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;
SQL 语句最后一行的 ELSE salary 非常重要,必须
写上。因为如果没有它,条件 1 和条件 2 都不满足的员工的工资就会
被更新成 NULL 。这一点与 CASE 表达式的设计有关,在刚开始介绍
CASE 表达式的时候我们就已经了解到,如果 CASE 表达式里没有明
确指定 ELSE 子句,执行结果会被默认地处理成 ELSE NULL
表之间的数据匹配
CASE 表达式里,我们可以使用 BETWEEN 、LIKE
和 < 、> 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓
词。因此,CASE 表达式具有非常强大的表达能力。
-- 表的匹配:使用IN 谓词
SELECT course_name,
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200706) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200707) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200708) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster;
-- 表的匹配:使用EXISTS 谓词
SELECT CM.course_name,
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200706
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200707
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200708
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster CM;
case 与in 和exists结合的用法
exists 当子查询不为空时返回true
选择多列数据中的最大值
一般从多行数据中选出