SQL Case when 的使用方法

SQL Case when 的使用方法

Case具有兩種格式:簡單Case函數(shù)和Case搜索函數(shù)藐握。

  • 簡單Case函數(shù)#####
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
  • Case搜索函數(shù)#####
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

這兩種方式,可以實現(xiàn)相同的功能航揉。簡單Case函數(shù)的寫法相對比較簡潔,但是和Case搜索函數(shù)相比栈妆,功能方面會有些限制初肉,比如寫判斷式。
還有一個需要注意的問題荆责,Case函數(shù)只返回第一個符合條件的值滥比,剩下的Case部分將會被自動忽略

比如說,下面這段SQL做院,你永遠無法得到“第二類”這個結果####

CASE WHEN col_1 IN ( 'a', 'b') THEN '第一類'
WHEN col_1 IN ('a')       THEN '第二類'
ELSE'其他' END

case函數(shù)的一些示例
一盲泛,已知數(shù)據(jù)按照另外一種方式進行分組,分析键耕。
=========================================

有如下數(shù)據(jù):

國家 人口
中國 600
美國 100
加拿大 100
英國 200
法國 300
日本 250
德國 200
墨西哥 50
印尼 250

根據(jù)這個國家人口數(shù)據(jù)寺滚,統(tǒng)計亞洲和北美洲的人口數(shù)量。應該得到下面這個結果屈雄。

人口
亞洲 1100
北美洲 250
其他 700

sql代碼如下:

CREATE TABLE `table_a` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `country` VARCHAR(100) DEFAULT NULL,
  `population` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO table_A (country,population) VALUES('中國',600);
INSERT INTO table_A (country,population) VALUES('美國',100);
INSERT INTO table_A (country,population) VALUES('加拿大',100);
INSERT INTO table_A (country,population) VALUES('英國',200);
INSERT INTO table_A (country,population) VALUES('法國',300);
INSERT INTO table_A (country,population) VALUES('日本',250);
INSERT INTO table_A (country,population) VALUES('德國',200);
INSERT INTO table_A (country,population) VALUES('墨西哥',50);
INSERT INTO table_A (country,population) VALUES('印度',250);


SELECT 
CASE country
WHEN '中國'   THEN '亞洲'
WHEN '印度'   THEN '亞洲'
WHEN '日本'   THEN '亞洲'
WHEN '美國'   THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他'
END AS '洲',
SUM(population) AS '人口'
FROM table_A
GROUP BY CASE country
WHEN '中國'   THEN '亞洲'
WHEN '印度'   THEN '亞洲'
WHEN '日本'   THEN '亞洲'
WHEN '美國'   THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END;

同樣的村视,我們也可以用這個方法來判斷工資的等級,并統(tǒng)計每一等級的人數(shù)酒奶。SQL代碼如下蚁孔;

SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM    Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;

二,用一個SQL語句完成不同條件的分組惋嚎。

數(shù)據(jù)如下:

國家 性別 人口
中國 1 340
中國 2 260
美國 1 45
美國 2 55
加拿大 1 51
加拿大 2 49
英國 1 40
英國 2 60

按照國家和性別進行分組杠氢,得出結果如下

國家
中國 340 260
美國 45 55
加拿大 51 49
英國 40 60

sql代碼:

CREATE TABLE `table_a` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `country` VARCHAR(100) DEFAULT NULL,
  `population` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO table_A (country,sex,population) VALUES('中國',1,340);
INSERT INTO table_A (country,sex,population) VALUES('中國',2,260);
INSERT INTO table_A (country,sex,population) VALUES('美國',1,45);
INSERT INTO table_A (country,sex,population) VALUES('美國',2,55);
INSERT INTO table_A (country,sex,population) VALUES('加拿大',1,51);
INSERT INTO table_A (country,sex,population) VALUES('加拿大',2,49);
INSERT INTO table_A (country,sex,population) VALUES('英國',1,40);
INSERT INTO table_A (country,sex,population) VALUES('英國',2,60);


SELECT country AS '國家',
SUM(CASE WHEN sex=1 THEN population ELSE 0 END) AS '男',
SUM(CASE WHEN sex=2 THEN population ELSE 0 END) AS '女'
FROM table_A
GROUP BY country;

最后提醒一下使用Case函數(shù)的新手注意不要犯下面的錯誤

CASE col_1
WHEN 1        THEN 'Right'
WHEN NULL  THEN 'Wrong'
END

在這個語句中When Null這一行總是返回unknown,所以永遠不會出現(xiàn)Wrong的情況另伍。因為這句可以替換成WHEN col_1 = NULL鼻百,這是一個錯誤的用法,這個時候我們應該選擇用WHEN col_1 IS NULL质况。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末愕宋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子结榄,更是在濱河造成了極大的恐慌中贝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼朗,死亡現(xiàn)場離奇詭異邻寿,居然都是意外死亡,警方通過查閱死者的電腦和手機视哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門绣否,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挡毅,你說我怎么就攤上這事蒜撮。” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵段磨,是天一觀的道長取逾。 經(jīng)常有香客問我,道長苹支,這世上最難降的妖魔是什么砾隅? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮债蜜,結果婚禮上晴埂,老公的妹妹穿的比我還像新娘。我一直安慰自己寻定,他們只是感情好儒洛,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狼速,像睡著了一般晶丘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唐含,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音沫浆,去河邊找鬼捷枯。 笑死,一個胖子當著我的面吹牛专执,可吹牛的內容都是我干的淮捆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼本股,長吁一口氣:“原來是場噩夢啊……” “哼攀痊!你這毒婦竟也來了?” 一聲冷哼從身側響起拄显,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤苟径,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后躬审,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棘街,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年承边,在試婚紗的時候發(fā)現(xiàn)自己被綠了遭殉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡博助,死狀恐怖险污,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情富岳,我是刑警寧澤蛔糯,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布拯腮,位于F島的核電站,受9級特大地震影響渤闷,放射性物質發(fā)生泄漏疾瓮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一飒箭、第九天 我趴在偏房一處隱蔽的房頂上張望狼电。 院中可真熱鬧,春花似錦弦蹂、人聲如沸肩碟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽削祈。三九已至,卻和暖如春脑漫,著一層夾襖步出監(jiān)牢的瞬間髓抑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工优幸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吨拍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓网杆,卻偏偏與公主長得像羹饰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碳却,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容