兩種語法形式
-- 1. 簡單 CASE:等值比較
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END
-- 2. 搜尋 CASE:布林表達式(更靈活)
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他'
END
核心特性
- 順序求值:從第一個 WHEN 開始,首個滿足條件即返回,後續分支被忽略
- 返回類型:所有 THEN/ELSE 結果隱式轉換為最高優先級類型
- ELSE 缺省:無 ELSE 且無匹配時返回
NULL
- 可嵌套:THEN/ELSE 中可再包含 CASE
實戰場景
-- 條件分組統計
SELECT
CASE
WHEN Score >= 90 THEN '優秀'
WHEN Score >= 80 THEN '良好'
WHEN Score >= 60 THEN '及格'
ELSE '不及格'
END AS Grade,
COUNT(*) AS Cnt
FROM Students
GROUP BY
CASE
WHEN Score >= 90 THEN '優秀'
WHEN Score >= 80 THEN '良好'
WHEN Score >= 60 THEN '及格'
ELSE '不及格'
END;
-- 動態排序
ORDER BY
CASE @SortBy
WHEN 'Name' THEN FirstName
WHEN 'Date' THEN CONVERT(VARCHAR, BirthDate, 112)
END;
-- 防除零
SELECT Amount / NULLIF(Quantity, 0) AS UnitPrice;
常見陷阱
- 類型衝突:
THEN '文字' ELSE 123 END → 錯誤,需顯式 CAST
2. 條件順序:範圍判斷必須從嚴格到寬鬆(如 ≥90 在 ≥80 前)
3. 簡單 CASE 無法寫複雜條件:需用搜尋 CASE
4. 聚合中不能直接引用別名:GROUP BY 必須重寫完整 CASE
IIF / CHOOSE 簡化替代 (SQL 2012+)
-- IIF:三元運算符
SELECT IIF(Sex = '1', '男', '女') FROM Users;
-- CHOOSE:索引選擇
SELECT CHOOSE(Month, '一月','二月','三月'...) FROM Dates;