SQL之CASE WHEN用法進階——where語句后跟case語句(二)
SQL之CASE WHEN用法進階——Update語句使用case更新、數據對比(三)
前言
作用: 可以使用它們在數據庫進行判斷功能,跟代碼中的if...else功能一樣.但是,它們又存在差異,下面就來講它們的具體作用和差別。
一: 使用語法
(一)普通case函數
CASE <表達式>
WHEN <值1> THEN <操作>
WHEN <值2> THEN <操作>
...
ELSE <操作>
END
(一)搜索case函數
CASE
WHEN <條件1> THEN <命令>
WHEN <條件2> THEN <命令>
...
ELSE commands
END
作用一: 結合分組統計數據
需求: 將下圖的數據按照"洲"進行統計總人數
(一)方式一: 使用普通的case函數進行統計
select (
case name
when '中國' then '亞洲'
when '日本' then '亞洲'
when '美國' then '北美洲'
when '加拿大' then '北美洲'
else '其他' end
) 洲,
sum(population) 總數
from t_country
GROUP BY
(
case name
when '中國' then '亞洲'
when '日本' then '亞洲'
when '美國' then '北美洲'
when '加拿大' then '北美洲'
else '其他' end
)
方式一統計結果
(二)方式二: 使用搜索的case函數進行統計
select (
case
when name in('中國','日本') then '亞洲'
when name in('美國','加拿大') then '北美洲'
else '其他' end
) 洲,
sum(population) 總數
from t_country
GROUP BY
(
case
when name in('中國','日本') then '亞洲'
when name in('美國','加拿大') then '北美洲'
else '其他' end
)
方式二統計結果
作用二: 分條件更新字段值
(一)需求: 將工資低於3000的員工漲幅工資20%,工資等於高於3000的員工漲幅8%,數據如下:
可能有人看到這個需求的第一反應,想直接可以直接通過如下兩條update語句直接更新:
update t_salary set salary = salary + (salary * 0.2) where salary < 3000;
update t_salary set salary = salary + (salary * 0.08) where salary >= 3000;
但是,如果是這樣執行的話實際上會存在問題,比如:原來工資在2900的員工,執行完第一條語句后工資會變成3480,此時,再執行第二條更新語句,因為滿足工資大於三千,則又會去添加多8%的工資,這樣明顯就是不符合我們的需求的,所以,如果想完成這個需求,又不想寫太復雜的sql,可以通過case函數完成這個功能。
(二)使用搜索的case函數進行分條件修改(此處不能使用簡單case函數,因為簡單case函數不能判斷帶范圍的條件)
update t_salary
set
salary =
(
case
when salary < 3000 then salary + salary * 0.2
when salary >= 3000 then salary + salary * 0.08
else salary
end
)
(三)分條件修改后結果
作用三: 檢查表中字段值是否一致
(一)需求: 判斷兩個表中name字段值是否一致,並返回結果,數據如下:
(二)使用搜索的case函數進行分條件修改(此處不能使用簡單case函數,因為簡單case函數不能判斷帶范圍的條件)
select name,
(
case
when desciption in(select description from t_user2) then '一致'
else '不一致'
end
) 比較結果
from t_user1
(三)比較結果:
作用四: 行轉列(重點-面試常見)
(一)需求: 將表中數據按照每個學生姓名 、科目、成績進行排序,數據如下:
(二)使用case函數轉換
// 使用普通case函數
SELECT NAME,
max( CASE class WHEN '語文' THEN grade ELSE 0 END ) 語文,
max( CASE class WHEN '數學' THEN grade ELSE 0 END ) 數學,
max( CASE class WHEN '英語' THEN grade ELSE 0 END ) 英語
FROM
t_source
GROUP BY
NAME
// 使用搜索case函數
SELECT NAME,
max( CASE WHEN class = '語文' THEN grade ELSE 0 END ) 語文,
max( CASE WHEN class = '數學' THEN grade ELSE 0 END ) 數學,
max( CASE WHEN class = '英語' THEN grade ELSE 0 END ) 英語
FROM
t_source
GROUP BY
NAME
(三)轉換結果
五:普通case函數和搜索case函數的區別
通過上面的案例可看到,普通的case函數寫法相對簡潔,但是功能也相對簡單,搜索case函數的功能更加強大,具體如下:
1、簡單case函數判斷條件只能是等於,而搜索case函數的條件可以是子查詢,In,大於、等於等等。
2、如果只是使用簡單的條件分組,可以選擇普通case函數,如果需要判斷更多的場景,則選擇搜索case更好。