以下内容首发于我的个人博客网站:
http://riun.xyz/
参考连接: https://www.cnblogs.com/HDK2016/p/8134802.html
一、分组时不同情况的处理
现有如下表:
需要按照大洲进行分组,最终得出如下结果:
可以使用case进行分组,sql如下:
SELECTsum( population ) AS '人数',
CASE`country` WHEN '中国' THEN'亚洲' WHEN '印度' THEN'亚洲' WHEN '日本' THEN'亚洲' WHEN '美国' THEN'北美洲' WHEN '加拿大' THEN'北美洲' WHEN '墨西哥' THEN'北美洲' ELSE '其他'
END AS '大洲'
FROMcasedemo
GROUP BY
CASE`country` WHEN '中国' THEN'亚洲' WHEN '印度' THEN'亚洲' WHEN '日本' THEN'亚洲' WHEN '美国' THEN'北美洲' WHEN '加拿大' THEN'北美洲' WHEN '墨西哥' THEN'北美洲' ELSE '其他'
END
就是说,单使用group分组只能对字段一致的分组,字段不一致的不会被分到一组;而使用case分组会对单个字段做类似switch case的情况处理,处理单个字段的不同情况,进行人为分组。
case语法为:
case 字段名 when 属性值1 then 被归类属性when 属性值2 then 被归类属性else 其他被归类属性
end
以上即作为group by
的条件,同时也作为select的内容。
(以上表数据见casedemo.sql)
二、分组后其他字段的计算
现有如下表:
需要查询出每个国家的男女性别的人数,最终得出如下结果:
可以使用case对查询内容进行计算,sql如下:
SELECTcountry,sum( CASE WHEN sex = 1 THEN population ELSE 0 END ) AS '男性',sum( CASE WHEN sex = 2 THEN population ELSE 0 END ) AS '女性'
FROMcasedemo2
GROUP BYcountry
上面将字段名sex写在了when后面,也可以像第一种情况一样写在case和when之间:
SELECTcountry,sum( CASE sex WHEN 1 THEN population ELSE 0 END ) AS '男性',sum( CASE sex WHEN 2 THEN population ELSE 0 END ) AS '女性'
FROMcasedemo2
GROUP BYcountry
这里根据country分组后对查询的内容使用case进行分情况处理。
(以上表数据见casedemo2.sql)
三、根据条件UPDATE
应用一:分条件update值
若有如下表:
现需要将工资5000以上(包括5000)的员工的工资减少10%,将工资在[2000,4600)之前的员工的工资增加15%,最终结果如下所示:
很容易让人想到使用两条sql:
update casedemo3 set salary = salary * 0.9 where salary >= 5000;
update casedemo3 set salary = salary * 1.15 where salary >= 2000 and salary < 4600
但是这样是不正确的做法。假设有人的工资是5000块,那么按照规定,她的工资应该减少10%,所以当执行第一条sql时,她的工资会变成4500;而当执行第二条sql时,她的工资小于4600,所以又会增加15%,最终变成5175。整体看来,本应工资减少的她,最后却增加了,所以这样是不符合逻辑的。
如果不想增加复杂的处理,我们可以使用一条sql来实现这个需求,如下:
UPDATE casedemo3
SET salary =
CASEWHEN salary >= 5000 THEN salary * 0.9 WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15 ELSE salary
END
注意,最后的else salary一定要有,如果没有的话会将不在这两个范围内的工资都设为null,因为在case函数中else部分的默认值是NULL,就是说不主动设置else的值那么就是NULL。
(以上表数据见casedemo3.sql)
四、检查两表中某字段是否一致
在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。
现有如下两表:和
现需检查两表中name字段和str字段是否一致,则可进行如下sql:
SELECT NAME,
CASE WHEN NAME IN ( SELECT str FROM casedemo42 ) THEN '一致' ELSE '不一致' END AS label
FROM
casedemo41
查询结果: