前言
作用: 可以使用它們在數據庫進行判斷功能,跟代碼中的if...else功能一樣.但是,它們又存在差異,下面就來講它們的具體作用和差別。
一: 使用語法
(一)普通case函數
CASE <表達式>
WHEN <值1> THEN <操作>
WHEN <值2> THEN <操作>
... ELSE <操作>
END
(二 )搜索case函數
CASE
WHEN <條件1> THEN <命令>
WHEN <條件2> THEN <命令>
... ELSE commandsEND
作用一: 結合分組統計數據
需求: 將下圖的數據按照"洲"進行統計總人數
源數據
(一)方式一: 使用普通的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更好。
六:總結
如果你想親自實踐,需要本文章的測試數據,可以私信回復: 【測試數據】即可
看到此處,你應該對Case函數有了更深入的認識,但是、關于Case函數的使用遠遠不止這一篇文章描述的,還需要我們在實踐中去發現更多的可能,如果你看完本文覺得有疑問或者本文有錯誤的地方,歡迎私信或者在下方留言指出。
碼字不易、如果你覺得本文對你有一點點幫助,可以點贊和關注!