前幾天,為了給產品分析當前用戶數據結構,寫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