一、CASE表达式:
用来描述条件分支;
--简单CASE表达式:
CASE sex
WHEN ‘1‘ THEN ‘男‘
WHEN ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END
--搜索CASE表达式:
CASE WHEN sex = ‘1‘ THEN ‘男‘
WHEN sex = ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END
注意事项:
- 各分支返回的数据类型必须统一;
- 必须要写END;
- 一般也必须写ELSE;
- 搜索CASE表达式的表达能力远大于简单表达式,一般都会使用前者。
一)、在聚合函数中使用CASE:
SELECT pref_name,
--男性人口
SUM(CASE WHEN sex = ‘1‘ THEN population ELSE 0 END) AS cnt_m,
--女性人口
SUM(CASE WHEN sex = ‘2‘ THEN population ELSE 0 END) AS cnt_f
FROM PopTbl2
GROUP BY pref_name;
? 上面的SQL语句就可以将一个列为[pref_name(县名), sex, population]的表转换成一个列为[县名, 男, 女]的表。这样的表就类似我们在Excel等软件中见到的表,也就是 二维表。
二)、在CASE语句中使用CHECK约束:
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
三)、在UPDATE语句里进行条件分支:
? 使用多个UPDATE语句可能造成冲突,不利于保持原子性。
--为工资高于300000的员工降薪
UPDATE Salaries
SET salary = salary * 0.9
WHERE salary >= 300000;
--为工资高于250000但低于280000的员工加薪
UPDATE Salaries
SET salary = salary * 1.2
WHERE salary >= 250000 AND salary < 280000;
--使用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;
如上面的示例,如果有员工工资高于300000,被降薪后正好处于加薪区间,最后的结果反而是他被加薪了。
四)、表之间的数据匹配:
? 可以借助BETWEEN、LIKE、<、>、IN等谓词组合增强CASE语句的表达能力。
五)、在CASE表达式中使用聚合函数:
? 在CASE表达式中使用聚合函数可以增强CASE语句的表达能力。
小结:
-
新手用HAVING子句进行条件分支,高手用SELECT子句进行条件分支。
-
CASE在SQL中被视为表达式,在执行时会被判定为一个固定值,因此它也可以被写在聚合函数内部。相比较过程式编程语言中的条件判断语句,SQL中的CASE更类似于Lisp、Scheme等函数式语言中的条件表达式。