比較單一運算式與多個值。
CASE search_expression
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
ELSE default_result
END
評估多個獨立布林條件,功能更強。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
>, <, BETWEEN, IN, LIKE 等)。-- 永遠不會回傳 '第二類'
CASE
WHEN col_1 IN ('a','b') THEN '第一類'
WHEN col_1 IN ('a') THEN '第二類'
ELSE '其他'
END
原始資料:國家人口表。需求:依洲份彙總人口 (原表無洲份欄位)。
SELECT SUM(population) AS 人口,
CASE country
WHEN '中國' THEN '亞洲'
WHEN '印度' THEN '亞洲'
WHEN '日本' THEN '亞洲'
WHEN '美國' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他'
END AS 洲
FROM Table_A
GROUP BY CASE country
WHEN '中國' THEN '亞洲'
WHEN '印度' THEN '亞洲'
WHEN '日本' THEN '亞洲'
WHEN '美國' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他'
END;
GROUP BY 必須重複完整 CASE 運算式 (不可用別名)。薪資分級:≤500→1, 501-600→2, 601-800→3, 801-1000→4, 其他→NULL。
SELECT
CASE
WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL
END AS salary_class,
COUNT(*)
FROM Table_A
GROUP BY CASE
WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL
END;
原始:國家、性別、人口。目標:列為國家,欄為男/女人口。
SELECT country,
SUM(CASE WHEN sex = '1' THEN population ELSE 0 END) AS 男,
SUM(CASE WHEN sex = '2' THEN population ELSE 0 END) AS 女
FROM Table_A
GROUP BY country;
UNION ALL 多掃描。規則:女員工薪資必須 > 1000;男員工無限制。
-- 正確:使用 CASE 實現條件約束
CONSTRAINT chk_salary CHECK (
CASE
WHEN sex = '2' THEN
CASE WHEN salary > 1000 THEN 1 ELSE 0 END
ELSE 1 -- 男員工直接通過
END = 1
);
-- 錯誤:單純 AND 會導致男員工無法插入
CONSTRAINT chk_salary CHECK (sex = '2' AND salary > 1000);
SELECT id,
CASE
WHEN val LIKE 'a%' THEN
CASE
WHEN val LIKE 'abcd%' THEN '2'
ELSE '1'
END
ELSE '999'
END AS case_result
FROM feng_test;
CASE 可作為外層 THEN 的結果運算式。a%) 應置於較嚴格條件 (abcd%) 之前,否則永遠匹配不到嚴格條件。NULL 導致下游錯誤。GROUP BY CASE ... 時,考慮建立虛擬欄位或物化視圖預先計算分組鍵。