CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
...
ELSE 預設結果
END
USE pubs
GO
SELECT
Title,
'Price Range' = CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 AND 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO
依價格區間分組統計書籍數量:
SELECT 'Number of Titles', COUNT(*)
FROM titles
GROUP BY CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 AND 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
GO
關鍵規則:GROUP BY 區塊必須完整重複 SELECT 區塊的 CASE 運算式,否則會報錯。
USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 AND 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 AND 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 AND 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO
| 場景 | 範例用法 |
|---|---|
| WHERE 子句動態篩選 | WHERE CASE WHEN type='A' THEN col1 ELSE col2 END > 100 |
| UPDATE 動態賦值 | SET status = CASE WHEN qty=0 THEN 'OOS' WHEN qty<10 THEN 'LOW' ELSE 'OK' END |
| 排序自訂優先序 | ORDER BY CASE priority WHEN 'H' THEN 1 WHEN 'M' THEN 2 ELSE 3 END |
| 聚合條件統計 | SUM(CASE WHEN region='East' THEN sales ELSE 0 END) |
| 動態轉換資料型別 | CASE WHEN ISNUMERIC(val)=1 THEN CAST(val AS INT) ELSE 0 END |
IIF (SQL 2012+) 或 CHOOSE 簡化簡單二元/多選邏輯CASE 遠不止「建立衍生欄位」的工具,善用其在 GROUP BY、ORDER BY、WHERE、聚合等子句中的表達力,能解決許多看似需要動態 SQL 或多次掃描才能完成的分組排序與條件統計問題,是 T-SQL 開發者必備的進階技能。