CASE 表達式是 SQL 中實現條件邏輯的核心工具,支援簡單/搜尋兩種語法,返回類型依語境自動推斷。本文系統梳理語法細節、類型規則與實戰模式。
CASE `運算式`
WHEN `比較值1` THEN `結果1`
WHEN `比較值2` THEN `結果2`
...
ELSE `預設結果`
END
類似 switch-case,運算式 與各 WHEN 值做等值比較。
CASE
WHEN `條件1` THEN `結果1`
WHEN `條件2` THEN `結果2`
...
ELSE `預設結果`
END
每個 WHEN 後接完整布林表達式,靈活度最高,支援範圍、複合條件。
THEN/ELSE 結果類型一致 → 直接返回該類型VARCHAR/TEXTDECIMAL/DOUBLE/BIGINTNULL 結果 → 返回類型可為 NULLSELECT CASE
WHEN 10*2 = 30 THEN '30 correct'
WHEN 10*2 = 40 THEN '40 correct'
ELSE 'Should be 10*2=20'
END AS `result`; -- 輸出: 'Should be 10*2=20'
SELECT CASE 10*2
WHEN 20 THEN '20 correct'
WHEN 30 THEN '30 correct'
WHEN 40 THEN '40 correct'
END AS `result`; -- 輸出: '20 correct'
SELECT
`Name`,
`RatingID` AS `Rating`,
CASE `RatingID`
WHEN 'R' THEN 'Under 17 requires an adult.'
WHEN 'X' THEN 'No one 17 and under.'
WHEN 'NR' THEN 'Use discretion when renting.'
ELSE 'OK to rent to minors.'
END AS `Policy`
FROM `DVDs`
ORDER BY `Name`;
輸出結果:
| Name | Rating | Policy |
|---|---|---|
| Africa | PG | OK to rent to minors. |
| Amadeus | PG | OK to rent to minors. |
| Christmas | NR | Use discretion when renting. |
| Doc | G | OK to rent to minors. |
| Falcon | NR | Use discretion when renting. |
| Mash | R | Under 17 requires an adult. |
| Show | NR | Use discretion when renting. |
| View | NR | Use discretion when renting. |
-- 動態排序:依參數決定排序欄位
SELECT * FROM `products`
ORDER BY CASE @sort_by
WHEN 'price_asc' THEN `price`
WHEN 'price_desc' THEN -`price`
WHEN 'name' THEN `name`
ELSE `created_at`
END;
-- 條件聚合:單次掃描統計多維度指標
SELECT
COUNT(*) AS `total`,
SUM(CASE WHEN `status` = 'paid' THEN 1 ELSE 0 END) AS `paid_count`,
SUM(CASE WHEN `amount` > 1000 THEN 1 ELSE 0 END) AS `large_order_count`,
AVG(CASE WHEN `type` = 'vip' THEN `amount` END) AS `vip_avg_amount`
FROM `orders`;
-- NULL 安全比較
SELECT CASE
WHEN `col` IS NULL THEN 'missing'
WHEN `col` = '' THEN 'empty'
ELSE `col`
END FROM `t1`;
ELSE NULL 或預設值,避免隱性返回 NULL 導致應用層異常WHERE CASE ... END = 'value' 無法使用索引,改寫為 WHERE (cond1 AND val1) OR (cond2 AND val2)...CASE ... WHEN ... THEN ... ELSE ... END 標準語法外,無額外擴展RETURNING 子句可配合 CASE 做複雜更新ELSE 省略時的隱性 NULL,需顯式寫出掌握 CASE 表達式的靈活運用,能將複雜業務邏輯下沉至資料庫層,減少應用層資料傳輸與處理,是 SQL 進階的必修課。