一文搞懂case when所有使用場景


前幾天,為了給產品分析當前用戶數據結構,寫sql的時候使用到了case when,今天來總結一下case when 的使用方法,以此為戒,感覺寫的不好請拍磚,感覺寫的還可以,給哥們點個贊,或者回復一下,讓我意識到我不是一個人在戰斗,好了廢話不多說了,進入正題。

關於case when的使用情況,我總結下來有三種,第一、等值轉換,第二、范圍轉換,第三、列轉行操作。

等值轉換

咱們在設計數據庫的時候總是會把用戶的性別用int存儲('0'為女,'1'為男),但是怎么把它轉換成漢字顯示呢?

原始表數據

 

SQL語句

select
name as '名字',
(case sex when 0 then '女' else '男' end) as '性別'
from test.student;

ps.最后的 'end' 別丟了,我剛開始使用的時候我就有這個毛病,並且一般的case when語句都會比較長,最好添加小括號包起來,這樣更容易閱讀。

查詢結果

 

范圍轉換

有的時候,也會遇到這種情況,按照用戶成績顯示優(90+)、良(80-90)、及格(60-80)、未及格(60-),這個跟第一個不同的是,他是一個分數的范圍,要怎么轉換成漢子顯示呢?你可能覺得很簡單,不就是吧when那換成條件嗎?先打住咱們往下看

原始表數據

 

 

SQL語句

select 
name as '姓名'
,(case score when score>=90 then '優' when score>=80 then '良' when score>=60 then '及格' else '不及格' end) as '等級'
from test.stu_score; 

這樣寫對不?

這個查出來的結果是

 

 

 

這是為啥呢?想明白了嗎? 

因為 case when就像一個 switch case語句一樣,如果你在case后填了東西,它會拿后它跟when 對比,咱們的 寫的case 后寫=了 score 而when后面寫了score>=90 ,然而,'score' 等於 'score>=90'嗎? 顯然不等於,那該怎么寫呢?

select 
name as '姓名'
,(case score when score>=90 then '優' when score>=80 then '良' when score>=60 then '及格' else '不及格' end) as '等級'
from test.stu_score; 

 

 

列轉行操作

還是用學生的例子吧,現在有圖1學生成績數據, 現在要怎么按圖2顯示出來呢?

圖1

 

圖2

 

 

第一步 先按照科目分開, 符合條件的設置分數,不符合的給置零。

select name as '姓名'
,(case course when '語文' then score else 0 end) as '語文'
,(case course when '數學' then score else 0 end) as '數學'
,(case course when '英語' then score else 0 end) as '英語'
from test.course_score

 

 

然后再按照名字group by ,對分數求max。

select name as '姓名'
,max(case course when '語文' then score else 0 end) as '語文'
,max(case course when '數學' then score else 0 end) as '數學'
,max(case course when '英語' then score else 0 end) as '英語'
from test.course_score group by name;

 

 
————————————————
版權聲明:本文為CSDN博主「慕容田雨」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/changxiangyangy/article/details/86718551


免責聲明!

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



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