sql中的case函數的使用

以下內容首發於我的個人博客網站:
http://riun.xyz/


參考連接: https://www.cnblogs.com/HDK2016/p/8134802.html

一、分組時不同情況的處理

現有如下表:在這裏插入圖片描述

需要按照大洲進行分組,最終得出如下結果:在這裏插入圖片描述

可以使用case進行分組,sql如下:

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

就是說,單使用group分組只能對字段一致的分組,字段不一致的不會被分到一組;而使用case分組會對單個字段做類似switch case的情況處理,處理單個字段的不同情況,進行人爲分組。

case語法爲:

case 字段名 
	when 屬性值1 then 被歸類屬性
	when 屬性值2 then 被歸類屬性
	else 其他被歸類屬性
end

以上即作爲group by的條件,同時也作爲select的內容。

(以上表數據見casedemo.sql

二、分組後其他字段的計算

現有如下表:在這裏插入圖片描述

需要查詢出每個國家的男女性別的人數,最終得出如下結果:在這裏插入圖片描述

可以使用case對查詢內容進行計算,sql如下:

SELECT
	country,
	sum( CASE WHEN sex = 1 THEN population ELSE 0 END ) AS '男性',
	sum( CASE WHEN sex = 2 THEN population ELSE 0 END ) AS '女性' 
FROM
	casedemo2 
GROUP BY
	country

上面將字段名sex寫在了when後面,也可以像第一種情況一樣寫在case和when之間:

SELECT
	country,
	sum( CASE sex WHEN 1 THEN population ELSE 0 END ) AS '男性',
	sum( CASE sex WHEN 2 THEN population ELSE 0 END ) AS '女性' 
FROM
	casedemo2 
GROUP BY
	country

這裏根據country分組後對查詢的內容使用case進行分情況處理。

(以上表數據見casedemo2.sql)

三、根據條件UPDATE

應用一:分條件update值

若有如下表:在這裏插入圖片描述

現需要將工資5000以上(包括5000)的員工的工資減少10%,將工資在[2000,4600)之前的員工的工資增加15%,最終結果如下所示:在這裏插入圖片描述

很容易讓人想到使用兩條sql:

update casedemo3 set salary = salary * 0.9 where salary >= 5000;
update casedemo3 set salary = salary * 1.15 where salary >= 2000 and salary < 4600

但是這樣是不正確的做法。假設有人的工資是5000塊,那麼按照規定,她的工資應該減少10%,所以當執行第一條sql時,她的工資會變成4500;而當執行第二條sql時,她的工資小於4600,所以又會增加15%,最終變成5175。整體看來,本應工資減少的她,最後卻增加了,所以這樣是不符合邏輯的。

如果不想增加複雜的處理,我們可以使用一條sql來實現這個需求,如下:

UPDATE casedemo3 
SET salary =
CASE
	WHEN salary >= 5000 THEN salary * 0.9 
	WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15 
	ELSE salary 
END

注意,最後的else salary一定要有,如果沒有的話會將不在這兩個範圍內的工資都設爲null,因爲在case函數中else部分的默認值是NULL,就是說不主動設置else的值那麼就是NULL。

(以上表數據見casedemo3.sql)

四、檢查兩表中某字段是否一致

在Case函數中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如說使用IN,EXISTS,可以進行子查詢,從而 實現更多的功能。

現有如下兩表:在這裏插入圖片描述在這裏插入圖片描述

現需檢查兩表中name字段和str字段是否一致,則可進行如下sql:

SELECT NAME,
CASE	
	WHEN NAME IN ( SELECT str FROM casedemo42 ) THEN '一致' 
	ELSE '不一致' 
	END AS label 
FROM
casedemo41

查詢結果:在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章