CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
適用於單一列/表達式與多個離散值比較。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
適用於範圍、複合條件、多列比較。
-- 簡單 CASE
SELECT product_id,
CASE product_type_id
WHEN 1 THEN 'Book'
WHEN 2 THEN 'Video'
WHEN 3 THEN 'DVD'
WHEN 4 THEN 'CD'
ELSE 'Magazine'
END AS product_category
FROM products;
-- 搜索 CASE (等價邏輯)
SELECT product_id,
CASE
WHEN product_type_id = 1 THEN 'Book'
WHEN product_type_id = 2 THEN 'Video'
WHEN product_type_id = 3 THEN 'DVD'
WHEN product_type_id = 4 THEN 'CD'
ELSE 'Magazine'
END AS product_category
FROM products;
CASE
WHEN region = 'APAC' THEN
CASE
WHEN country = 'CN' THEN 'China'
WHEN country = 'JP' THEN 'Japan'
ELSE 'Other APAC'
END
WHEN region = 'EMEA' THEN 'Europe/Middle East/Africa'
ELSE 'Americas'
END
CASE col WHEN NULL THEN ... 永遠不匹配 (NULL != NULL)。WHEN col IS NULL THEN ... (需用搜索 CASE)。TO_CHAR/TO_NUMBER 統一。-- 動態排序
ORDER BY CASE :sort_col
WHEN 'name' THEN ename
WHEN 'sal' THEN TO_CHAR(sal,'FM999990.00')
WHEN 'hired' THEN hiredate
END;
-- 條件聚合 (單掃描多指標)
SELECT deptno,
COUNT(CASE WHEN sal > 3000 THEN 1 END) AS high_sal_cnt,
SUM(CASE WHEN job = 'SALESMAN' THEN comm ELSE 0 END) AS sales_comm
FROM emp
GROUP BY deptno;
| 特性 | CASE | DECODE |
|---|---|---|
| 標準 | ANSI SQL | Oracle 專有 |
| 比較類型 | 等值/範圍/複合 | 僅等值 |
| NULL 語義 | 搜索 CASE 支持 IS NULL | NULL=NULL 視為匹配 |
| 可讀性 | 結構清晰 | 參數位置易混淆 |
| 性能 | 相同 (內部均轉為 CASE) | 相同 |
結論: 新代碼統一使用 CASE,遷移舊 DECODE 時注意 NULL 語義差異。
DECODE 或查找表 JOIN,解析更快。