DECODE 與 CASE 都是 Oracle 條件邏輯的常用工具,但適用場景不同。本文透過範例解析兩者差異與選擇指引。
SELECT CASE SIGN(5-5)
WHEN 1 THEN 'Is Positive'
WHEN -1 THEN 'Is Negative'
ELSE 'Is Zero'
END
FROM DUAL;
邏輯等同:
if (SIGN(5-5) == 1) return 'Is Positive'; else if (SIGN(5-5) == -1) return 'Is Negative'; else return 'Is Zero';
SELECT DECODE(SIGN(5-5), 1, 'Is Positive', -1, 'Is Negative', 'Is Zero') FROM DUAL;
邏輯等同:
switch (SIGN(5-5)) {
case 1: return 'Is Positive';
case -1: return 'Is Negative';
default: return 'Is Zero';
}
DECODE 僅支援「等值比對」;CASE 支援任意布林運算式,包含範圍、多條件組合。
-- CASE 輕鬆處理範圍
SELECT CASE
WHEN salary < 30000 THEN 'Low'
WHEN salary < 60000 THEN 'Medium'
WHEN salary < 100000 THEN 'High'
ELSE 'Very High'
END AS grade
FROM employees;
-- DECODE 需配合 SIGN/TRUNC 等技巧,極不直觀且難維護
| 面向 | DECODE | CASE |
|---|---|---|
| 適用場景 | 少量離散值等值比對 | 範圍、複合條件、巢狀邏輯 |
| 可讀性 | 參數多時難閱讀 | 結構清晰,接近自然語言 |
| 效能 | 極簡單情況略快 | 現代優化器幾乎無差異 |
| 標準相容 | Oracle 專有 | ANSI SQL 標準,可移植 |
掌握兩者特性,寫出既高效又易讀的 SQL。