-- 1. 簡單 CASE (等值判斷)
CASE expr
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
-- 2. 搜索 CASE (條件表達式)
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
SELECT name,
CASE category
WHEN 'Holiday' THEN 'Seasonal'
WHEN 'Profession' THEN 'Bi_annual'
WHEN 'Literary' THEN 'Random'
ELSE 'Unknown'
END AS pattern
FROM sales;
輸出:將業務分類代碼轉換為報表友好標籤。
SELECT
SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS excellent,
SUM(CASE WHEN score >= 60 AND score < 90 THEN 1 ELSE 0 END) AS pass,
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail,
AVG(CASE WHEN score >= 60 THEN score END) AS pass_avg
FROM exam;
優勢: 一次全表掃描完成多維統計,避免多次 UNION 或子查詢。
-- 前端傳入 sort_by=name|score, sort_order=asc|desc
ORDER BY
CASE WHEN @sort_by = 'name' AND @sort_order = 'asc' THEN name END ASC,
CASE WHEN @sort_by = 'name' AND @sort_order = 'desc' THEN name END DESC,
CASE WHEN @sort_by = 'score' AND @sort_order = 'asc' THEN score END ASC,
CASE WHEN @sort_by = 'score' AND @sort_order = 'desc' THEN score END DESC;
-- 會員等級判定
SELECT user_id,
CASE
WHEN total_amount >= 100000 AND order_count >= 50 THEN 'Diamond'
WHEN total_amount >= 50000 AND order_count >= 20 THEN 'Platinum'
WHEN total_amount >= 10000 AND order_count >= 5 THEN 'Gold'
WHEN total_amount >= 1000 THEN 'Silver'
ELSE 'Bronze'
END AS vip_level
FROM user_stats;
-- COALESCE/IFNULL 等價寫法
SELECT
CASE WHEN col IS NULL THEN 'N/A' ELSE col END AS col_display,
COALESCE(col, 'N/A') AS col_display2;
WHEN 子句按順序評估,命中即停止。將高概率條件前置。THEN / ELSE 返回類型應一致,否則隱式轉換可能導致索引失效或精度損失。WHERE CASE ... END = 'value' 無法使用索引,需改寫為 WHERE (cond1 AND val1) OR (cond2 AND val2) ...。SUM(CASE WHEN ... THEN 1 ELSE 0 END) 是標準條件計數模式,優化器識別度高。ELSE 可省略,默認返回 NULL。CASE 支持,但建議邏輯扁平化,超過 3 層考慮拆分視圖或應用層處理。