DECODE 是 Oracle 專有函數,CASE 為 ANSI SQL 標準。兩者皆可實現條件邏輯,但適用場景、擴充性與可讀性差異顯著。本文透過底層實現類比與實戰案例深度對比。
SELECT CASE SIGN(5-5)
WHEN 1 THEN 'Is Positive'
WHEN -1 THEN 'Is Negative'
ELSE 'Is Zero'
END
FROM dual;
概念對應: IF (cond==1) ... ELSE IF (cond==-1) ... ELSE ...
SELECT DECODE(SIGN(5-5), 1, 'Is Positive', -1, 'Is Negative', 'Is Zero')
FROM dual;
概念對應: SWITCH (cond) { CASE 1: ... CASE -1: ... DEFAULT: ... }
SELECT CASE
WHEN x_field < 40 THEN 'X_FIELD < 40'
WHEN x_field < 50 THEN 'X_FIELD < 50'
WHEN x_field < 60 THEN 'X_FIELD < 60'
ELSE 'UNKNOWN'
END
FROM dual;
DECODE 僅支援等值比較。實現範圍判斷需轉換為離散值映射,例如:
-- 極其繁瑣且不靈活
SELECT DECODE(TRUNC(x_field/10),
3, '30-39',
4, '40-49',
5, '50-59',
'OTHER')
FROM dual;
且無法處理 x_field < 40 這類開放區間邊界條件。
| 維度 | DECODE | CASE |
|---|---|---|
| 標準 | Oracle 專有 | ANSI SQL:1999 標準 |
| 比較類型 | 僅等值 | 等值 + 範圍 + 複合條件 |
| NULL 語義 | DECODE(NULL, NULL, 'A') → 'A'(視為相等) | CASE WHEN NULL THEN ... 需用 IS NULL |
| 回傳型別 | 由第一個結果決定,隱含轉型 | 所有分支型別需相容,否則報錯 |
| 巢狀深度 | 參數位置固定,巢狀極難閱讀 | 自然支援巢狀與多層結構 |
| 可讀性 | 參數多時難以維護 | 關鍵字清晰,易於維護 |
| 效能 | 內部實現相近,差異微乎其微 | 優化器對 CASE 支援更完善 |
DECODE(status, 'A', 'Active', 'I', 'Inactive', 'Unknown')END CASE;)功能更強-- DECODE 視 NULL 相等,CASE 需額外處理
CASE
WHEN selector IS NULL AND compare_value IS NULL THEN result
WHEN selector = compare_value THEN result
ELSE default_result
END
INSERT /*+ APPEND */ ... SELECT CASE ... 平行執行