CASE 是 T-SQL 中實現條件邏輯的核心表達式,支援「簡單 CASE」與「搜尋 CASE」兩種形式,可用於 SELECT/WHERE/ORDER BY/GROUP BY/聚合函數等任意位置,是行轉列、分組統計、業務規則編碼的瑞士軍刀。
| 形式 | 語法 | 適用場景 |
|---|---|---|
| 簡單 CASE | CASE col WHEN val1 THEN r1 WHEN val2 THEN r2 ELSE r3 END | 單列與多個離散值比較 (等值判斷) |
| 搜尋 CASE | CASE 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;
SELECT StuId, StuName,
CASE StuSex
WHEN 'M' THEN '男'
WHEN 'F' THEN '女'
ELSE '其他'
END AS SexLabel
FROM Student;
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;
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;
CASE
WHEN Type = 'A' THEN
CASE WHEN SubType = 'X' THEN 1 ELSE 2 END
WHEN Type = 'B' THEN 3
ELSE 0
END
SELECT * FROM Products
ORDER BY
CASE @SortBy
WHEN 'Price' THEN Price
WHEN 'Name' THEN Name
ELSE Id
END;
THEN / 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。