SQL之CASE WHEN用法進階——Update語句使用case更新、數據對比(三)


SQL之CASE WHEN基礎用法詳解(一)

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更好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM