SQL進階1:case表達式的用法示例


一:case表達式的用法

1、SQL中的case表達式的作用是用來對“某個變量”進行某種轉化,通常在select字句中使用,舉個例子:


image

不能看出,case表達式很像我們的if else的作用,在發現為真的 WHEN 子句時,CASE 表達式的真假值判斷就會中止,而剩余的 WHEN 子句會被忽略。case表達式有兩種寫法:

-- 簡單CASE 表達式
CASE sex
   WHEN '1' THEN '男'
   WHEN '2' THEN '女'
ELSE '其他' END

-- 搜索CASE 表達式
CASE WHEN sex = '1' THEN '男'
      WHEN sex = '2' THEN '女'
ELSE '其他' END

注意點:

* else這句非必須但最好帶上,如果when中沒有符合條件的,且有沒有else控制,那么,這樣的case會返回null,null不是個好東西,所以你一定要盡量控制減少返回null的情況。

* 簡單點說,在能寫列名和常量的地方,通常都可以寫 CASE 表達式,因為它返回的是一個標量值。


2、使用case實現不同條件的統計:

還是上一個學生表,如果讓你查詢出各個省份的男生總數和女生總數你會怎么搞呢?

我反正稍加思考,可以想到這樣寫:

--查看所有學生信息
select StudentID,[Name],Province,Gender,(case Gender
                                    when 0 then N''
                                    when 1 then N''
                                    else '' end) StuGender
from dbo.T_Student

--查詢出各省的男女生總數:
select p.Province,sum(p.MaleCount) TotalMale,sum(p.FamaleCount) TotalFamale 
from (
    select Province, count(1) MaleCount,0 as FamaleCount
    from dbo.T_Student
    where gender=1
    group by Province
    union 
    select Province, 0,count(1) FamaleCount
    from dbo.T_Student
    where gender=0
    group by Province
)as p 
group by p.Province

對應的執行結果:

image

so,可以看到,能實現功能,但是代碼卻那么長,看着不舒服,這時咱們看看如何用case來拯救世界吧:

--查看所有學生信息
select StudentID,[Name],Province,Gender,(case Gender
                                    when 0 then N''
                                    when 1 then N''
                                    else '' end) StuGender
from dbo.T_Student

--查詢出各省的男女生總數:
select Province,
sum(case when Gender=1 then 1 else 0 end ) as MaleCount,
sum(case when Gender=0 then 1 else 0 end ) as FeMaleCount
from dbo.T_Student
group by Province

執行結果:

image

so,僅僅5行就搞定了,差別很明顯,新手where,高手case,good。

3、在update操作中使用case條件分支,比如有個員工表Salaries,工資字段為salary ,

假設現在需要根據以下條件對該表的數據進行更新。

  1. 對當前工資為 30 萬日元以上的員工,降薪 10%。
  2. 對當前工資為 25 萬日元以上且不滿 28 萬日元的員工,加薪 20%。

那么更新的SQL語句可以這樣寫:

-- 用CASE 表達式寫正確的更新操作
UPDATE Salaries
   SET salary = CASE WHEN salary >= 300000
                     THEN salary * 0.9
                     WHEN salary >= 250000 AND salary < 280000
                     THEN salary * 1.2
                     ELSE salary END;


** 參考:圖靈社區的《SQL進價教程》一書。


免責聲明!

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



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