SQL中CASE關鍵字的使用


https://blog.csdn.net/wuzuodingfeng/article/details/53523176

 

使用方法

代碼示例

CASE關鍵字有兩種使用方法,分別是‘簡單case函數’和‘case搜索函數’

簡單case函數

CASE sex
    WHEN '1' THEN ''
    WHEN '2' THEN ''
ELSE '其他' END

 

case搜索函數

CASE sex
    WHEN sex='1' THEN ''
    WHEN sex='2' THEN ''
ELSE '其他' END

分析說明

  1. 簡單case函數是case搜索函數的真子集 
    • 簡單case函數的使用方法與一些高級語言(如:java)中的switch語句相似:CASE給定匹配字段,WHEN給出具體的字段值,如果匹配到后返回THEN值。
    • 簡單case函數其實就是case搜索函數的‘=’邏輯的實現。case搜索函數可以實現簡單case函數的所有功能,而簡單case函數卻不可實現case搜索函數的‘=’邏輯以外的功能。
  2. case函數匹配原則 
    • case函數與switch的不同在於case僅返回第一個匹配到的結果,而switch則會在沒有中斷的情況下繼續后面的判斷,將會執行所有匹配的結果。
  3. case搜索函數比簡單case函數更加靈活 
    • case搜索函數與簡單case函數相比的靈活之處在於可以在WHEN中書寫判斷式。

case關鍵字的一些妙用

替換

在某些時候,我們需要在查詢結果中使用字符串替換掉數據庫中原本存儲的字符串,如:數據庫中的性別存儲方式是以‘1’表示‘男’、‘0’表示‘女’。如果不進行替換,則查詢結果中只會包含‘1’和‘0’,但我們希望能以‘男’和‘女’的形式進行展示。此時我們就可以使用case語句來進行實現:

SELECT 
    name,
    CASE gender
        WHEN '1' THEN ''
        WHEN '0' THEN ''
    ELSE '其他' END
FROM
    T_USER

 

分類

說到分類,在SQL中應該首選GROUP BY。然而GROUP BY也不是萬能的,如果有進行范圍分類,就有些力不從心了,需要與CASE配合才能完成。比如:當前用戶表(T_USER)中有100萬條數據,用戶記錄中有年齡字段(age),我們現在划分年齡小於18歲的是未成年成、大於等於18歲小於40歲的年輕人、大於等於40歲小於60歲的是中年人、大於等於60歲的是老年人,現需要統計各類人群的數量。

SELECT
    CASE age
        WHERE age < 18 THEN '未成年人'
        WHERE age >= 18 AND age < 40 THEN '年輕人'
        WEHRE age >= 40 AND age < 60 THEN '中年人'
        WHERE age >= 60 THEN '老年人'
    ELSE '其他' END '人群類型',
    COUNT(*) '數量'
FROM T_USER
GROUP BY
    CASE age
        WHERE age < 18 THEN '未成年人'
        WHERE age >= 18 AND age < 40 THEN '年輕人'
        WEHRE age >= 40 AND age < 60 THEN '中年人'
        WHERE age >= 60 THEN '老年人'
    ELSE '其他' END

降維

這里的降維主要是降低數據庫查詢次數,我們可以將數據庫的每個select作為數據的一個維度,維度越高,數據庫服務器處理該數據的資源消耗就越多,子查詢就是一個極度消耗資源的查詢方式。這里就給出一個減少子查詢的案例,如:同樣是“分類”欄目下的那個表(T_USER),人群分類相同,另外說明:用戶表中的用戶來自於國內的不同省(province)。現在需要統計的是,各省的各類人群的數量。

SELECT province,
    SUM( CASE age WHERE age < 18 THEN 1 ELSE 0 END) '未成年人',
    SUM( CASE age WHERE age >= 18 AND age < 40 THEN 1 ELSE 0 END) '年輕人',
    SUM( CASE age WHERE age >= 40 AND age < 60 THEN 1 ELSE 0 END) '中年人',
    SUM( CASE age WHERE age >= 60 THEN 1 ELSE 0 END) '老年人',
FROM T_USER
GROUP BY
    province

 


免責聲明!

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



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