case when


一、使用方法

Case 具有兩種格式:簡單 Case 函數和 Case 搜索函數。

  1. 簡單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.employee

  2. Case搜索函數

    格式說明

        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 已知數據按照另外一種方式進行分組,分析。

  1. 有如下數據:(國家代碼是 Primary Key)

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

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


    輸出每一個人的薪資等級


    然后計算每一個等級的數量

    方法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) 結果一致。

三、內容來源

ichenhao - case when用法


免責聲明!

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



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