【《SQL进阶教程》】1-1 CASE表达式

一、CASE表达式:

用来描述条件分支;

--简单CASE表达式:
CASE sex
	WHEN ‘1‘ THEN ‘男‘
	WHEN ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END

--搜索CASE表达式:
CASE WHEN sex = ‘1‘ THEN ‘男‘
	 WHEN sex = ‘2‘ THEN ‘女‘
ELSE ‘其他‘ END

注意事项:

  1. 各分支返回的数据类型必须统一;
  2. 必须要写END;
  3. 一般也必须写ELSE;
  4. 搜索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等函数式语言中的条件表达式。

【《SQL进阶教程》】1-1 CASE表达式

上一篇:Spring基础-08-jdbcTemplate


下一篇:Oracle Fetch(限制行数)子句