一、闡述
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代碼如下:
01 | select ? sum (population), |
02 | ??????????? case country |
03 | ??????????? when '中國' ???? then '亞洲' |
04 | ??????????? when '印度' ???? then '亞洲' |
05 | ??????????? when '日本' ???? then '亞洲' |
06 | ??????????? when '美國' ???? then '北美洲' |
07 | ??????????? when '加拿大' ? then '北美洲' |
08 | ??????????? when '墨西哥' ? then '北美洲' |
09 | ??????????? else '其他' end |
10 | ??????????? from ???table_a |
11 | ??????????? group by case country |
12 | ??????????? when '中國' ???? then '亞洲' |
13 | ??????????? when '印度' ???? then '亞洲' |
14 | ??????????? when '日本' ???? then '亞洲' |
15 | ??????????? when '美國' ???? then '北美洲' |
16 | ??????????? when '加拿大' ? then '北美洲' |
17 | ??????????? when '墨西哥' ? then '北美洲' |
18 | ??????????? 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函數來完成這個功能的例子
1 | select country, |
2 | ??????????? sum ( case when sex = '1' then |
3 | ??????????? population else 0 end ),? --男性人口 |
4 | ??????????? sum ( case when sex = '2' then |
5 | ??????????? population else 0 end )?? --女性人口 |
6 | ??????????? from ?table_a |
7 | ??????????? 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一定執行,就把她寫在最前面。