首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server CASE WHEN 進階用法詳解:從條件邏輯到動態樞紐分析

     編輯:關於SqlServer

CASE 表達式兩大語法形式

SQL Server 提供兩種 CASE 語法,靈活應對不同業務場景:

1. 簡單 CASE 表達式

適用於單一運算式與多個值的等值比較,語法簡潔:

CASE input_expression
    WHEN when_expression THEN result_expression
    [ ...n ]
    [ ELSE else_result_expression ]
END

2. 搜尋 CASE 表達式

支援複雜布林邏輯判斷,適用於範圍、多條件組合:

CASE
    WHEN boolean_expression THEN result_expression
    [ ...n ]
    [ ELSE else_result_expression ]
END

實戰場景:學生成績橫向轉換

建立測試資料:

CREATE TABLE Score (
    StudentID NVARCHAR(10),
    Subject   NVARCHAR(10),
    Score     INT
);

INSERT INTO Score VALUES
('0001','語文',87), ('0001','數學',79), ('0001','英語',95),
('0002','語文',69), ('0002','數學',84), ('0001','語文',95);

場景一:行轉列(動態樞紐)

使用聚合函數配合 CASE 實現科目列展開:

SELECT 
    StudentID,
    SUM(CASE WHEN Subject = '語文' THEN Score ELSE 0 END) AS 語文,
    SUM(CASE WHEN Subject = '數學' THEN Score ELSE 0 END) AS 數學,
    SUM(CASE WHEN Subject = '英語' THEN Score ELSE 0 END) AS 英語
FROM Score
GROUP BY StudentID;

結果: 每位學生一行,各科成績分列顯示,便於報表呈現。

場景二:成績等級分類

搜尋 CASE 實現多區間判斷:

SELECT 
    StudentID, Score,
    CASE 
        WHEN Score >= 90 THEN '優'
        WHEN Score >= 80 THEN '良'
        WHEN Score >= 70 THEN '中'
        WHEN Score >= 60 THEN '及格'
        ELSE '不及格'
    END AS Grade
FROM Score;

進階技巧與注意事項

1. CASE 在 ORDER BY 中動態排序

SELECT * FROM Products
ORDER BY 
    CASE @SortColumn
        WHEN 'Price'  THEN Price
        WHEN 'Name'   THEN Name
        WHEN 'Stock'  THEN Stock
    END;

2. CASE 配合聚合實現條件統計

SELECT 
    Department,
    COUNT(*) AS Total,
    SUM(CASE WHEN Salary > 50000 THEN 1 ELSE 0 END) AS HighSalaryCount,
    AVG(CASE WHEN Gender = 'F' THEN Salary END) AS AvgFemaleSalary
FROM Employees
GROUP BY Department;

3. 巢狀 CASE 處理複雜業務規則

CASE 
    WHEN Region = 'Asia' THEN
        CASE 
            WHEN Country = 'Japan' THEN 'JP_' + ProductCode
            WHEN Country = 'China' THEN 'CN_' + ProductCode
            ELSE 'AS_' + ProductCode
        END
    WHEN Region = 'Europe' THEN 'EU_' + ProductCode
    ELSE 'OT_' + ProductCode
END

效能優化建議

  • 避免在 WHERE 子句中使用 CASE:可能導致掃描全表,改用 SARGable 條件。
  • 資料型別一致性:所有 THEN/ELSE 回傳型別需隱含轉換相容,否則報錯。
  • ELSE 子句防禦:明確指定 ELSE 預設值,避免非預期的 NULL 結果。
  • 簡單 CASE 優先:等值比較場景優先使用簡單 CASE,執行計畫更優化。

常見陷阱

陷阱:CASE WHEN Score = 87 THEN '良' WHEN Score = 79 THEN '良' ... 針對離散值逐一列舉。
改進:改用區間判斷 WHEN Score BETWEEN 80 AND 89 THEN '良',減少維護成本與執行計畫膨脹。

總結

CASE 表達式是 T-SQL 中實現條件邏輯的核心工具,掌握其兩種語法差異、巢狀應用、與聚合函數結合的模式,能顯著提升查詢靈活性與報表開發效率。記住:每個 CASE 對應一個輸出列,合理規劃輸出結構是關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved