一、使用方法
Case 具有兩種格式:簡單 Case 函數和 Case 搜索函數。
簡單Case函數
格式說明
case 列名
when 條件值1 then 選項1
when 條件值2 then 選項2
.......
else 默認值 end舉例
select
case job_level
when '1' then '1111'
when '2' then '1111'
when '3' then '1111'
else 'eee' end
from dbo.employeeCase搜索函數
格式說明
case
when 列名= 條件值1 then 選項1
when 列名=條件值2 then 選項2
.......
else 默認值 end舉例:
update employee
set e_wage =
case
when job_level = '1' then e_wage*1.97
when job_level = '2' then e_wage*1.07
when job_level = '3' then e_wage*1.06
else e_wage*1.05
end
兩種格式,可以實現相同的功能。
簡單 Case 函數的寫法相對比較簡潔,但 Case 搜索函數的功能更加豐富,比如寫判斷式。還有一個需要注意的問題,Case函數只返回第一個符合條件的值,剩下的 Case 部分將會被自動忽略。
二、使用案例
2.1 已知數據按照另外一種方式進行分組,分析。
有如下數據:(國家代碼是 Primary Key)

根據這個國家人口數據,統計各個大洲的人口數量。

用這個方法來判斷工資的等級,並統計每一等級的人數

輸出每一個人的薪資等級
然后計算每一個等級的數量方法1:

方法2:

2.2 豎表轉橫表
如下表所示,統計日本、泰國不同性別的人口,“sex”中 1 代表男性、2代表女性、3代表無性、4代表雙性,
要求以(國家、男性、女性、無性、雙性)為字段輸出表。

首先生成確定的字段(國家、男性、女性、無性、雙性),然后以case when來判斷性別中人口的取值,並輸出表如下圖:

最后使用 group by 來通過國家分組,並取其中的最大值(有的人會使用sum求和,效果也是一樣的)。最終結果如下圖:

2.3 根據條件有選擇的 update
P_key 是表 A_TEST1 的主鍵,結果 a 和 b 的順序搞反了,這是需要把 a 和 b 倒換過來,一般情況下,要想把兩條數據的Primary key(a 和 b)交換,需要經過臨時存儲,拷貝,讀回數據的三個過程,要是使用 Case 函數的話,一切都變得簡單多了。

使用下列方式可將主鍵 a、b 替換過來

但這里有一個問題一定要注意,else 后面一定要將原有的值放進來,否則除了 a、b 意外的值會被置成 null,如下圖

2.4 統計數量
select
count(*) allCnt,
sum(case when user_read_flag!=1 then 1 else 0 end) unReadCnt
from BUS_VISIT_RECORD
where person_id = 'p20032815461007'
select
count(*) allCnt,
count(case when user_read_flag!=1 then 1 else null end) unReadCnt
from BUS_VISIT_RECORD
where person_id = 'p20032815461007'
注意:當使用 count 時,else 不能為 0,count(0) 與 count(1) 結果一致。
