CASE语句有两种:
一种是case [column] when,指定了判断条件所在的列。
另一种是case when [column],因为条件在子句中所以能对任意列进行判断。
本例建立一个员工表,有员工id(id),员工姓名(name)、部门id(department_id)和员工年龄(age))4个字段
再建立一个部门表,记录部门id(id)和部门名称(name)
case [column] when
Case [column] when 类似于switch,限制于对固定1个条字段的条件判断。
SELECT id,
CASE department_id WHEN 501 THEN "销售" ELSE "研发" END AS department_name
FROM t_clerk
这个语句的功能是,显示字段id和department_name。当与id同一行的department_id是501时department_name显示“销售”,否则显示“研发”。
【case department_id】:先锁定对`department_id`进行判断。
【when 501】:只指定了一个值,因为是对`department_id`进行判断,所以此处的条件是department_id=501
【THEN “销售”】:对每一行记录进行遍历,若某一行的department_id是501则选择“销售”。(select字段时将显示该字段每一行的值,select一个字符串时则会直接显示这个字符串)
【else “研发”】:同理,如果某一行的department_id不是501则返回“研发”
【end】:是一个case的结束边界。
case when [column]
case when [column]中的column可以是任意列,且应是列中值的条件。
SELECT id,
CASE
WHEN department_id < 502 THEN "销售"
WHEN department_id > 501 THEN "研发"
ELSE "无"
END Dname
FROM t_clerk
可以看出有多个when。对于每个id,会从上到下依次执行每个when,直到满足条件(再往下的when不执行)。
比如,将第一个when设置为永真条件department_id<503
SELECT id,
CASE
WHEN department_id < 503 THEN "销售" #永真条件
WHEN department_id > 501 THEN "研发"
ELSE "无"
END Dname
FROM t_clerk
则所有department_name值都是销售。
若第一个值有一半的记录满足,而第二条是永真,则一半都是销售(由第一条when判断来赋值),另一半是研发(不触发第一个条件,但是触发第二个条件)。
每个when里的条件可以是不同列的值,比如刚才使用的永真条件可以改为age<200
SELECT id,
CASE
WHEN age < 200 THEN "销售" #永真条件
WHEN department_id > 501 THEN "研发"
ELSE "无"
END Dname
FROM t_clerk
这样所有人显示的部门名称都是销售。