CASE表达式的用法

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表达式的强大之处.

猜你喜欢

转载自blog.csdn.net/qq_39940205/article/details/84038276