CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
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
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
關鍵點: GROUP BY 子句中必須完整重複 SELECT 中的 CASE 表達式(或使用相同別名/序數,視版本而定)。
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 PriceRange,
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
-- 範例:價格區間篩選
SELECT * FROM titles
WHERE CASE
WHEN price IS NULL THEN 0
WHEN price < 10 THEN 1
WHEN price BETWEEN 10 AND 20 THEN 2
ELSE 3
END IN (1, 2) -- 只取 Bargain 和 Average
SELECT
COUNT(CASE WHEN price < 10 THEN 1 END) AS bargain_count,
COUNT(CASE WHEN price BETWEEN 10 AND 20 THEN 1 END) AS average_count,
COUNT(CASE WHEN price > 20 THEN 1 END) AS premium_count
FROM titles
CROSS APPLY (SQL 2005+) 或 CTE 簡化。