DECODE 是 Oracle 特有的條件判斷函數,語法靈活、性能優異,常用於報表轉換、數據清洗、動態計算等場景。本文從語法結構、巧用 SIGN 實現範圍判斷、薪資分級調整實戰三個維度深度解析。
DECODE(expr, search1, result1, search2, result2, ..., default)
expr:被比較的表達式(列、常量、函數結果)。searchN:匹配值,支持隱式類型轉換。resultN:匹配成功時返回的結果。default:可選,所有搜尋值均不匹配時返回,省略則返回 NULL。本質:等值比較的「開關-案例」結構,不支持 >、<、>=、<= 等範圍運算符。
SIGN(n) 返回:1(正數)、-1(負數)、0(零)。結合 DECODE 可實現「大於/小於」邏輯:
-- 示例:比較 100 與 20
SELECT DECODE(SIGN(100-20), 1, '100>20', -1, '100<20', 0, '100=20') FROM dual;
-- 結果:'100>20'
需求:薪資 < 3000 漲 10%,≥ 3000 漲 5%。
SELECT salary,
CASE WHEN salary < 3000 THEN salary * 1.10
ELSE salary * 1.05 END AS new_salary
FROM employees;
SELECT salary,
DECODE(SIGN(salary - 3000), -1, salary * 1.10, 1, salary * 1.05, 0, salary * 1.05) AS new_salary
FROM employees;
解析:
salary - 3000 為負(即 < 3000)時,SIGN 返回 -1,匹配第一個結果 salary * 1.10。salary - 3000 為正或零(即 ≥ 3000)時,SIGN 返回 1 或 0,均走 salary * 1.05。DECODE(job, 'CLERK', DECODE(deptno, 10, 'A', 20, 'B', 'OTHER'), 'MANAGER', 'MGR', 'OTHER')
DECODE(col, NULL, 'IS NULL', 'NOT NULL') 可直接匹配 NULL,無需 IS NULL 判斷。DECODE 內部優化為單次掃描,比等效 CASE WHEN 在大數據集下略快(尤其早期版本)。DECODE 僅 Oracle 支持,跨庫項目建議使用標準 CASE WHEN。| 特性 | DECODE | CASE WHEN |
|---|---|---|
| 語法風格 | 函數式,緊湊 | 語句式,可讀性強 |
| 範圍判斷 | 需配合 SIGN/TRUNC 等技巧 | 原生支持 >, <, BETWEEN 等 |
| NULL 匹配 | 直接支持 | 需用 IS NULL |
| 跨平台 | 僅 Oracle | ANSI SQL 標準,全數據庫支持 |
| 推薦場景 | 簡單等值轉換、報表列映射、舊代碼維護 | 複雜邏輯、新開發、跨庫兼容 |

熟練掌握 DECODE 及其組合技巧,能讓您在 Oracle 環境下編寫更簡潔、高效的 SQL,尤其在歷史系統維護與報表快速開發中極具價值。