一、阐述
case when then else end 可以理解为java的if-else if -else。可以理解为流程控制语句或条件控制语句。可以实现资料获取的时候,可以更多的条件和自定义逻辑。
适用情景
- 对已知的数据库中数据,按照自己的逻辑,进行自定义分组和数据分析
- 用此条件控制语句,实现自定义条件分组
- 条件控制语句中嵌套函数达到理想的计算效果
二、具体使用
1.已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为primary key)
国家(country) | 人口(population) |
中国 | 600 |
美国 | 100 |
加拿大 | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西哥 | 50 |
印度 | 250 |
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 | 人口 |
亚洲 | 1100 |
北美洲 | 250 |
其他 | 700 |
想要解决这个问题,假如使用case函数,sql代码如下:
select sum(population), case country when '中国' then'亚洲' when '印度' then'亚洲' when '日本' then'亚洲' when '美国' then'北美洲' when '加拿大' then'北美洲' when '墨西哥' then'北美洲' else '其他' end from table_a group by case country when '中国' then'亚洲' when '印度' then'亚洲' when '日本' then'亚洲' when '美国' then'北美洲' when '加拿大' then'北美洲' when '墨西哥' then'北美洲' else '其他' end;
2.用一个sql语句完成不同条件的分组。
有如下数据
国家(country) | 性别(sex) | 人口(population) |
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
按照国家和性别进行分组,得出结果如下
国家 | 男 | 女 |
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
普通情况下,用union也可以实现用一条语句进行查询。但是那样增加消耗(两个select部分),而且sql语句会比较长。
下面是一个是用case函数来完成这个功能的例子
select country, sum( case when sex = '1' then population else 0 end), --男性人口 sum( case when sex = '2' then population else 0 end) --女性人口 from table_a group by country;
这样我们使用select,完成对二维表的输出形式,充分显示了case函数的强大。
补充:对case when 的理解总结
1、then和else后,只能写一条输出语句且输出结果就是新生成列的值;when 后的条件判断可以有多条,且可以多个字段联合判断;end 后的输出也可以有多条,但必须有一个是新生成列的字段名; [常规用法:select 后到from前,直接使用case when] (例1)
2、when 后多条件判断用and连接(例3)
3、case when 巧妙用法 [order by 后用case when] [count()中用case when] (例2)
4、group by 后用case when (在参考里)
5、case when,如果有多个,如果一条记录满足第一个case when就不会再去执行后面的case when,所以要想保证某个case when一定执行,就把她写在最前面。