以下內容首發於我的個人博客網站:
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
查詢結果: