通用函數處理 NULL 值、條件邏輯、值映射,是 SQL 查詢與 PL/SQL 開發核心工具。
expr1 為 NULL → 返回 expr2expr1SELECT NVL(NULL, 0), NVL(3, 0) FROM dual; -- 0, 3
expr1 非 NULL → 返回 expr2expr1 為 NULL → 返回 expr3SELECT e.empno, e.ename, e.job, e.hiredate,
(e.sal + NVL2(e.comm, e.comm, 0)) * 12 年薪
FROM emp e;
expr1SELECT NULLIF(1,1), NULLIF(1,2) FROM dual; -- NULL, 1
-- 比較姓名長度與職位長度
SELECT e.empno, e.ename, e.job, LENGTH(e.ename), LENGTH(e.job),
NULLIF(LENGTH(e.ename), LENGTH(e.job)) 長度是否相同
FROM emp e;
等值多重分支,類似 switch-case。僅支援等值比較。
SELECT e.ename, e.sal,
DECODE(e.job, 'CLERK', '業務員', 'SALESMAN', '銷售員',
'MANAGER', '經理', 'ANALYST', '分析師',
'PRESIDENT', '總裁') 職位
FROM emp e;
支援範圍判斷、複合條件、巢狀邏輯,可讀性優於 DECODE。
-- 簡單 CASE
SELECT e.ename, e.sal, e.job,
CASE e.job
WHEN 'CLERK' THEN e.sal * 1.1
WHEN 'SALESMAN' THEN e.sal * 1.2
WHEN 'MANAGER' THEN e.sal * 1.3
ELSE e.sal * 1.5
END 新薪資
FROM emp e;
-- 搜尋 CASE(支援任意條件)
CASE
WHEN e.sal < 1000 THEN '低薪'
WHEN e.sal BETWEEN 1000 AND 3000 THEN '中薪'
ELSE '高薪'
END
返回第一個非 NULL 表達式,等同巢狀 NVL。ANSI 標準,可移植。
SELECT e.ename, e.sal, e.comm,
COALESCE(e.comm, 100, 2000) -- comm 不為空用 comm,否則 100,再否則 2000
FROM emp e;
| 需求 | 推薦函數 | 備註 |
|---|---|---|
| 單一 NULL 替換預設值 | NVL | 最簡潔、效能最佳 |
| NULL/非 NULL 兩種不同結果 | NVL2 | 避免 CASE WHEN x IS NULL |
| 兩值相等時返回 NULL | NULLIF | 除零保護:sal / NULLIF(cnt,0) |
| 等值多重分支映射 | DECODE / CASE | 新代碼優先用 CASE |
| 範圍/複合條件分支 | CASE | 唯一選擇 |
| 多備選值取首個非 NULL | COALESCE | ANSI 標準、可變參數 |
-- 1. NVL
(e.sal + NVL(e.comm, 0)) * 12
-- 2. NVL2
(e.sal + NVL2(e.comm, e.comm, 0)) * 12
-- 3. COALESCE
(e.sal + COALESCE(e.comm, 0)) * 12
-- 4. CASE
(e.sal + CASE WHEN e.comm IS NULL THEN 0 ELSE e.comm END) * 12
-- 5. NULLIF 防除零(假設需計算平均提成)
AVG(e.comm) / NULLIF(COUNT(e.comm), 0)