流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率:
函数 | 功能 |
---|---|
IF(value, t, f) | 如果value为真,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1非空,则返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1] … ELSE [default] END | 如果val1为真,则返回res1,… 否则返回default默认值 |
CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END | 如果expr的值等于val1,则返回res1,… 否则返回default默认值 |
if
select if(false, 'Ok', 'Error');
ifnull
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
这里注意,这里的空指的是null,不是指一个空字符,或者空字符串,所以第二条select会返回 ’ '。
case when then else end
查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市
select name ,(case workaddress when '北京' then '一线城市'
when '上海' then '一线城市'
when '深圳' then '一线城市'
else '二线城市' end) as '工作地址' from emp
我们举一个例子来加深印象:
create table score
(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id, name, math, english, chinese)
VALUES (1, 'Tom', 67, 88, 95),
(2, 'Rose' , 23, 66, 90),
(3, 'Jack', 56, 98, 76);
我们要分别查询他们每科的成绩,并根据他们的成绩来划分成绩等级(优秀,及格,不及格)
select id name,
(case when math >= 85 then '优秀'
when math >= 60 then '及格'
else '不及格' end) '数学',
(case when english >= 85 then '优秀'
when english >= 60 then '及格'
else '不及格' end) '英语',
(case when chinese >= 85 then '优秀'
when chinese >= 60 then '及格'
else '不及格' end) '语文'
from score;