一、闡述
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一定執行,就把她寫在最前面。