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质况。