DECODE 是 Oracle 獨有的強大條件判斷函數,語法結構如下:
DECODE(表達式, 條件1, 結果1, 條件2, 結果2, ..., [預設結果])
運作邏輯:依序比較「表達式」與各「條件」,相等則返回對應「結果」;若無匹配則返回「預設結果」(省略時返回 NULL)。
-- 範例:根據部門編號返回部門名稱
SELECT ename,
DECODE(deptno, 10, 'ACCOUNTING',
20, 'RESEARCH',
30, 'SALES',
40, 'OPERATIONS',
'UNKNOWN') AS dname
FROM emp;
SIGN(n) 返回:正數→1、負數→-1、零→0。結合 DECODE 可實現數值區間判斷:
-- 範例:薪資調整邏輯
-- 薪資 < 3000 漲 10%,>= 3000 漲 5%
SELECT ename, sal,
DECODE(SIGN(sal - 3000),
-1, sal * 1.10, -- sal < 3000
1, sal * 1.05, -- sal > 3000
0, sal * 1.05) -- sal = 3000
AS new_sal
FROM emp;
利用巢狀 DECODE 或字串串接實現複雜邏輯:
-- 範例:職稱與部門雙重條件調薪
SELECT ename, job, deptno, sal,
DECODE(job, 'CLERK',
DECODE(deptno, 10, sal*1.15, 20, sal*1.10, sal*1.05),
'SALESMAN', sal*1.20,
'MANAGER', sal*1.10,
sal*1.05) AS new_sal
FROM emp;
DECODE 將 NULL 視為可匹配的特殊值:
-- 範例:COMM 欄位有 NULL 時顯示 'N/A'
SELECT ename, comm,
DECODE(comm, NULL, 'N/A', TO_CHAR(comm)) AS comm_display
FROM emp;
| 特性 | DECODE | CASE 表達式 |
|---|---|---|
| 語法標準 | Oracle 專有 | ANSI SQL 標準 |
| 比較方式 | 僅支援等值比較 | 支援任意條件運算式(>, <, LIKE, BETWEEN 等) |
| 可讀性 | 簡單邏輯較簡潔 | 複雜邏輯結構更清晰 |
| 效能 | 略優(內部優化) | 現代版本差異極小 |
| 建議場景 | 簡單等值映射、舊系統維護 | 新開發、複雜條件判斷 |
-- 同樣的薪資調整邏輯用 CASE 寫法
SELECT ename, sal,
CASE
WHEN sal < 3000 THEN sal * 1.10
ELSE sal * 1.05
END AS new_sal
FROM emp;
-- 搜尋型 CASE(支援複雜條件)
SELECT ename, sal, comm,
CASE
WHEN sal < 2000 THEN 'Low'
WHEN sal BETWEEN 2000 AND 4000 THEN 'Medium'
WHEN sal > 4000 AND comm IS NOT NULL THEN 'High + Commission'
ELSE 'High'
END AS salary_level
FROM emp;
DECODE 是 Oracle 開發者的得力工具,特別擅長處理離散值映射與簡單範圍判斷。雖然 ANSI SQL 的 CASE 表達式功能更強、可攜性更好,但在既有 Oracle 系統維護與特定簡單場景下,DECODE 依然具備語法簡潔、執行效率高的優勢。掌握兩者優劣,根據場景選擇最適工具,才是資深開發者的必修課。