sql中的case函数 2020-05-21 13:51 > 参考连接: https://www.cnblogs.com/HDK2016/p/8134802.html ### 一、分组时不同情况的处理 现有如下表: 需要按照大洲进行分组,最终得出如下结果:  可以使用case进行分组,sql如下: ```sql SELECT sum( population ) AS '人数', CASE `country` WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END AS '大洲' FROM casedemo GROUP BY CASE `country` WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END ``` 就是说,单使用group分组只能对字段一致的分组,字段不一致的不会被分到一组;而使用case分组会对单个字段做类似switch case的情况处理,处理单个字段的不同情况,进行人为分组。 case语法为: ```sql case 字段名 when 属性值1 then 被归类属性 when 属性值2 then 被归类属性 else 其他被归类属性 end ``` 以上即作为`group by`的条件,同时也作为select的内容。 ### 二、分组后其他字段的计算 现有如下表:  需要查询出每个国家的男女性别的人数,最终得出如下结果:  可以使用case对查询内容进行计算,sql如下: ```sql SELECT country, sum( CASE WHEN sex = 1 THEN population ELSE 0 END ) AS '男性', sum( CASE WHEN sex = 2 THEN population ELSE 0 END ) AS '女性' FROM casedemo2 GROUP BY country ``` 上面将字段名sex写在了when后面,也可以像第一种情况一样写在case和when之间: ```sql SELECT country, sum( CASE sex WHEN 1 THEN population ELSE 0 END ) AS '男性', sum( CASE sex WHEN 2 THEN population ELSE 0 END ) AS '女性' FROM casedemo2 GROUP BY country ``` 这里根据country分组后对查询的内容使用case进行分情况处理。 (以上表数据见casedemo2.sql) ### 三、根据条件UPDATE #### 应用一:分条件update值 若有如下表:  现需要将工资5000以上(包括5000)的员工的工资减少10%,将工资在[2000,4600)之前的员工的工资增加15%,最终结果如下所示:  很容易让人想到使用两条sql: ```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来实现这个需求,如下: ```sql UPDATE casedemo3 SET salary = CASE WHEN 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: ```sql SELECT NAME, CASE WHEN NAME IN ( SELECT str FROM casedemo42 ) THEN '一致' ELSE '不一致' END AS label FROM casedemo41 ``` 查询结果: --END--
发表评论