继续学习CASE表达式的实用的场景案例
用一条SQL语句进行不同条件的统计
进行不同条件的统计是CASE
表达式的著名用法之一,例如班级表按照班级名称分组,统计每组中男生女生数量多少,语句如下:
SELECT c.class_name,
SUM(CASE
WHEN c.sex = 0 THEN
c.student_count
ELSE
0
END) AS '男',
SUM(CASE
WHEN c.sex = 1 THEN
c.student_count
ELSE
0
END) AS '女'
FROM sys_class c
GROUP BY c.class_name
输出:
class_name 男 女
大一班 100 21
这个技巧可贵的地方在于,它能将SQL的查询结果转换为二维表的格式。如果只是简单地用GROUP BY
进行聚合,那么查询后必须通过宿主语言或者Excel等应用程序将结果的格式转换一下,才能使之成为交叉表。看上面的执行结果会发现,此时输出的已经是侧栏为县名、表头为性别的交叉表了。在制作统计表时,这个功能非常方便。
用CHECK约束定义多个列的条件关系
CASE
表达式和CHECK
约束是很般配的一对组合,假设某公司规定女性员工的工资必须在20万日元以下,而在这个公司的人事表中,这条无理的规定是使用CHECK
约束来描述的,代码如下:
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万日元以下”这个命题。
在UPDATE语句里进行条件分支
以某数值型的列的当前值为判断对象,将其更新成别的值。比如员工工资表,现在需要根据新规定调整薪资,就可以采用CASE
语句来实现,如下:
--用CASE表达式写正确的更新操作
UPDATE Salaries
SET salary = CASE WHEN salary >= 3000
THEN salary * 0.9
WHEN salary >= 2500 AND salary < 2800
THEN salary * 1.2
ELSE salary END;
需要注意的是,SQL语句最后一行的ELSE salary
非常重要,必须写上。因为如果没有它,条件1和条件2都不满足的员工的工资就会被更新成NULL。
下一章节见!