CASE表达式的一大优势在于能够判断表达式.在CASE表达式里,可以使用BETWEEN,LIKE和<,>等,以及能够嵌套子查询的IN和EXISTS.
假设有张学生和课程表
怎么得到下图效果?
使用CASE表达式进行行列转换
select distinct a.name,case when a.name in (select c.name from `courses` c where c.course='UNIX基础') then '√' else '○' end as unix,
case when a.name in (select c.name from `courses` c where c.course='Java中级') then '√' else '○' end as java,
case when a.name in (select c.name from `courses` c where c.course='SQL入门') then '√' else '○' end as `sql`
from `courses` a ;
简单CASE表达式的写法
CASE sex WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END
搜索CASE表达式的写法
CASE WHEN sex=1 THEN '男' WHEN sex=2 THEN '女' ELSE '其他' END
将已有编号方式转换为新的方式并统计
select case when `pref_name` in ('德岛','香川','爱媛','高知') then '四国'
when `pref_name` in ('佐贺','长崎','福冈') then '九州'
else '其他' end as 地区名,sum(`population`) as '人口' from `poptbl` group by 地区名;
进行不同条件的统计是CASE表达式的著名用法之一
select `pref_name`,sum(case when sex=1 then `population` else 0 end)as '男',
sum(case when sex=2 then `population` else 0 end)as '女'
from `poptbl2` group by `pref_name`;
这里是将行结构的数据转换为列结构的数据.除了sum, count.avg等聚合函数也可以将行结构转换为列结构.学会用SELECT子句进行条件分支.
在UPDATE语句里进行条件分支
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;
select std_id,case when count(1)=1 -- 只加入了一个俱乐部的学生
then `club_id`
else max(case when `main_club_flg`='Y' then `club_id` else 0 end) end as 俱乐部
from `studentclub` group by `std_id`;
这条SQL语句在CASE表达式里使用了聚合函数,又在聚合函数里使用了CASE表达式,主要目的是用CASE WHEN COUNT(1)=1......ELSE..... 这样的CASE表达式来表示"只加入了一个俱乐部还是多个俱乐部"这样的条件分支.
CASE表达式用在SELECT子句时,既可以写在聚合函数内部,也可以写在聚合函数外部.这种高度自由的写法正是CASE表达式的强大之处.