最近在磕《SQL进阶教程》第一章就总结了case表达式,有些用法之前练习的时候有刷到,但是没有深入的了解,这次刚好把这本书的提到的,结合做过的习题总结一下。
一、将已有编号方式转换为新的方式并统计
将数据按照某个类别进行分类统计的时候可以利用case表达式
eg:如果想要完成如下的转换

利用case表达式即可,具体的代码如下

最终结果为

二、用一条SQL语句进行不同条件统计
case 表达式能够根据不同条件进行统计,能够将列结构的数据转换成行数据,这个技巧难能可贵的地方在于将SQL的查询结果变成二维表
作者的点评即“新手用where 句子进行条件分支,高手用select 句子进行条件分支"
比如(经典面试50 题)---- 35、查询所有学生的课程及分数情况;

具体代码为

最终结果

eg 2、(书后习题)

具体代码

最后结果

三、用update进行条件分支
该应用场景需求为:以某数值型的列的当前在值为判断对象,将其更新为别的值,关键问题为这个时候update操作条件是多条语句,如果只是根据每个条件写一条update语句则会出现多次更新的情况即第一次更新的结果可能变成第二次更新的条件,会再次更新。
具体例子如下:

此时应该考虑用update进行条件分支
具体代码如下

结果为

四、表间数据的匹配
1、
case表达式的一大优势在于能够判断表达式,在case表达式里可以使用between,like,in等谓词,具有非常强大的表达能力
作者给出的例子

具体的代码

结果

应用根据经典面试50题
两个数据表,如果想要制作教师课表的话也可以仿照这个模式
具体如下表

具体SQL语句

最后结果

2、嵌套的case 语句制作交叉表
具体的例子

具体代码如下:(作者在嵌套的语句中使用的sum,我发现其实maxe也可以)

结果

应用:如果将学生成绩表也变成学生选课表,看出哪些学生选学了课程
具体如下

具体代码如下:

最终的学生选课结果为

五、case表达式中使用聚合函数
作者给出的例子是想要从学生加入社团的表中列出每个学生主要参加的社团,但是这些学生可有些参与一个社团(main_club_flg=N)能不止参与了一个社团(main_club_flg=Y or N)

如果按照学生参与社团的个数分开来统计,则需要写多条语句,如果用case 表达式则精简很多。

主要的逻辑case 条件分支就以学生的参与社团个数
若参与数为1(count(*)=1) 则直接输出社团号,否则为社团参与数不止一个
若他们参与的社团主标志为Y则输出社团号

最后的结果

作者的点评是新手用having语句进行条件分支,高手用select语句进行条件分支。