SQL Server 提供兩種 CASE 語法,靈活應對不同業務場景:
適用於單一運算式與多個值的等值比較,語法簡潔:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[ ELSE else_result_expression ]
END
支援複雜布林邏輯判斷,適用於範圍、多條件組合:
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;
SELECT * FROM Products
ORDER BY
CASE @SortColumn
WHEN 'Price' THEN Price
WHEN 'Name' THEN Name
WHEN 'Stock' THEN Stock
END;
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;
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
陷阱:
CASE WHEN Score = 87 THEN '良' WHEN Score = 79 THEN '良' ...針對離散值逐一列舉。
改進:改用區間判斷WHEN Score BETWEEN 80 AND 89 THEN '良',減少維護成本與執行計畫膨脹。
CASE 表達式是 T-SQL 中實現條件邏輯的核心工具,掌握其兩種語法差異、巢狀應用、與聚合函數結合的模式,能顯著提升查詢靈活性與報表開發效率。記住:每個 CASE 對應一個輸出列,合理規劃輸出結構是關鍵。