CASE WHEN
基于列的逻辑表达式,其实就是CASE表达式,可以运用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句中,这里讲的是T-SQL,所以只讲SELECT和ORDER BY对于CASE的运用。
CASE表达式类似编程语言中的
IF..THEN..ELSE..,只是CASE表达式不能控制SQL语句的流程,只作为基于列的逻辑使用
SELECT CASE column WHEN 1 THEN 'NO.1' WHEN 2 THEN 'NO.2' ELSE 'UNKOWN' END AS col FROM table_name
上面代码中,CASE后面跟选择的列名,后面的WHEN为该列中的值,THEN为实际现实的值
CASE表达式的情况可以分为两种:
1.
CASE简单表达式:将某个表达式与一组简单的表达式进行比较以确认结果
2.
CASE搜索表达式:计算一组布尔表达式已确认结果
CASE简单表达式
在CASE简单表达式中,整个表达式只会取一列的值做相应的判断,上面的查询就是一个简单表达式。
CASE简单表达式的值只局限在一列中,所以THEN后面的值的数据类型必须相同,或者兼容,否则报错。
在语句中,还有一个ELSE,这个语句可以省略,但最好保留,否则不在匹配范围内的所有值都显示为NULL。
CASE搜索表达式
与简单表达式不同,CASE搜索表达式提供了更强大的功能,CASE搜索表达式不仅可以使用更复杂的逻辑表达式,还可以根据多列中的值来确定显示的值,拿上面的例子来表达就是:
SELECT CASE WHEN column=1 THEN 'NO.1' WHEN column=2 THEN 'NO.2' ELSE 'UNKOWN' END AS col FROM table_name
SELECT CASE WHEN column1>30 AND column2='M' THEN 'NO.1'
WHEN column3 <=30 AND column2='M' THEN 'NO.2'
ELSE 'UNKWON'
END AS col FROM table_name
上面可以看到,搜索表达式一列的WHEN可以取自不同的列,甚至是不同列之间的运算,比如:WHEN (column1+column2>10 )。CASE搜索表达式可以完全实现简单表达式,
所以建议用搜索表达式
还有需要注意的是,WHEN..THEN是以先后顺序出现,当第一个WHEN后面的表达式为FALSE时,才会去看第二个WHEN后的表达式,以此类推,当第一个WHEN后面的表达式为TRUE时,即使第二个表达式也为TRUE,也只取第一个转换的值。
CASE表达式在ORDER BY 中的运用
CASE表达式在ORDER BY中可以将排序结果分类,使符合某些条件的行采用一种排序方式,符合另一种条件的就按照另一种排序
比如:我想查看省份ID为8和9的员工地址,当省份ID为9时,按照AddressID降序排序,当省份ID为8时,按照AddressID升序排序


注意,当使用在ORDER BY中时,每一条排序规则都要写一个单独的CASE表达式,前面说了,因为CASE表达式是基于列的,一个CASE表达式只能返回一个值,所以基于多个值的排序,则需要多个CASE表达式