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

SQL Server CASE 表達式完整指南:簡單/搜尋形式、嵌套、聚合配合、面試真題實戰

     編輯:關於SqlServer

CASE 是 T-SQL 中實現條件邏輯的核心表達式,支援「簡單 CASE」與「搜尋 CASE」兩種形式,可用於 SELECT/WHERE/ORDER BY/GROUP BY/聚合函數等任意位置,是行轉列、分組統計、業務規則編碼的瑞士軍刀。

兩種語法形式

形式語法適用場景
簡單 CASECASE col WHEN val1 THEN r1 WHEN val2 THEN r2 ELSE r3 END單列與多個離散值比較 (等值判斷)
搜尋 CASECASE WHEN cond1 THEN r1 WHEN cond2 THEN r2 ELSE r3 END複雜布爾表達式、範圍判斷、多列組合

基礎範例:百分制轉等級

SELECT 
    StuId, TestBase,
    CASE 
        WHEN TestBase >= 90 THEN 'A'
        WHEN TestBase >= 80 THEN 'B'
        WHEN TestBase >= 70 THEN 'C'
        WHEN TestBase >= 60 THEN 'D'
        ELSE 'E'
    END AS Grade
FROM Score;

進階用法

1. 性別碼值轉換 (簡單 CASE)

SELECT StuId, StuName,
    CASE StuSex 
        WHEN 'M' THEN '男' 
        WHEN 'F' THEN '女' 
        ELSE '其他' 
    END AS SexLabel
FROM Student;

2. 收支分欄 (搜尋 CASE + 聚合)

SELECT 
    Number,
    CASE WHEN Amount > 0 THEN Amount ELSE 0 END AS Income,
    CASE WHEN Amount < 0 THEN -Amount ELSE 0 END AS Expense
FROM PracticeTest;

3. 行轉列:學生課程成績橫表 (面試高頻)

SELECT 
    StuId,
    SUM(CASE WHEN Course = '語文' THEN Score ELSE 0 END) AS Chinese,
    SUM(CASE WHEN Course = '數學' THEN Score ELSE 0 END) AS Math,
    SUM(CASE WHEN Course = '英語' THEN Score ELSE 0 END) AS English
FROM Score
GROUP BY StuId;

4. 嵌套 CASE

CASE 
    WHEN Type = 'A' THEN 
        CASE WHEN SubType = 'X' THEN 1 ELSE 2 END
    WHEN Type = 'B' THEN 3
    ELSE 0
END

5. ORDER BY 動態排序

SELECT * FROM Products
ORDER BY 
    CASE @SortBy 
        WHEN 'Price' THEN Price 
        WHEN 'Name' THEN Name 
        ELSE Id 
    END;

關鍵規則與陷阱

  • 返回類型統一:所有 THEN / ELSE 返回類型必須隱式兼容,否則報錯「資料類型轉換失敗」。
  • 順序敏感:條件自上而下匹配,**首個滿足即返回**,後續不再評估。
  • ELSE 可選:省略時隱含 ELSE NULL。
  • 聚合中使用:SUM(CASE WHEN ... THEN 1 ELSE 0 END) 實現條件計數,比 COUNT(CASE...) 更直觀 (COUNT 不計 NULL)。
  • 不支援:CASE 中不可直接賦值變量,需 SET @Var = CASE ... END。

面試真題變體:動態列聚合

題目:已知表 Sales(Year, Quarter, Amount),輸出每年四季度金額與全年總計。

SELECT 
    Year,
    SUM(CASE WHEN Quarter = 1 THEN Amount END) AS Q1,
    SUM(CASE WHEN Quarter = 2 THEN Amount END) AS Q2,
    SUM(CASE WHEN Quarter = 3 THEN Amount END) AS Q3,
    SUM(CASE WHEN Quarter = 4 THEN Amount END) AS Q4,
    SUM(Amount) AS Total
FROM Sales
GROUP BY Year
ORDER BY Year;

效能提示

  • CASE 在查詢計劃中表現為 Scalar Operator,開銷極低。
  • 大數據量行轉列時,確保 GROUP BY 列有索引,避免 Hash Match 溢寫 TempDB。
  • 避免在 WHERE 中使用 CASE (可改寫為 AND/OR),破壞 SARGability。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved