SQL进阶 CASE表达式(二)

74 阅读1分钟

继续学习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。

下一章节见!