NULL 代表「未知」,而非「空」或「零」。Oracle 與 SQL Server 對 NULL 的處理存在關鍵差異。本文系統整理 NULL 的核心特性、比較邏輯真值表、NVL/COALESCE 函數族、索引與排序行為、動態 SQL 綁定 NULL 陷阱、與 SQL Server 差異對比。
PRIMARY KEY、NOT NULL 約束欄位NULL ≠ 0 ≠ '' ≠ ' ' (空字串在 Oracle 視同 NULL)NULL + 10 = NULL,結果仍為 NULLNULL || 'abc' = 'abc',CONCAT(NULL, 'abc') = 'abc' (忽略 NULL)| 運算式 | 結果 | 說明 |
|---|---|---|
NULL = NULL | UNKNOWN (顯示為無行) | 任何與 NULL 比較 (=, <>, <, >) 均為 UNKNOWN |
NULL IS NULL | TRUE | 唯一正確判斷 NULL 的方式 |
NULL IS NOT NULL | FALSE | |
NVL(NULL, 0) = NVL(NULL, 0) | TRUE | 轉換後比較 |
'' = '' | UNKNOWN | Oracle 空字串即 NULL |

| 函數 | 語法 | 邏輯 | 範例 |
|---|---|---|---|
NVL | NVL(expr1, expr2) | expr1 為 NULL 回傳 expr2,否則 expr1 | NVL(comm, 0) |
NVL2 | NVL2(expr1, expr2, expr3) | expr1 NULL 回傳 expr3,否則 expr2 | NVL2(comm, 'Y', 'N') |
NULLIF | NULLIF(expr1, expr2) | 相等回傳 NULL,否則 expr1 (型別必須相同) | NULLIF(1, 1) → NULL |
COALESCE | COALESCE(expr1, expr2, ...) | 回傳第一個非 NULL 參數 (型別需一致) | COALESCE(comm, sal, 0) |
類型轉換規則:NVL2 以 expr2 為準;COALESCE 要求所有參數同型別,隱式轉換失敗報錯 ORA-01722。
WHERE col IS NULL 無法使用該欄位的 B*Tree 索引 (需建立函數索引 NVL(col, 'NULL') 或位圖索引)COUNT(col) 忽略 NULL,統計非 NULL 行數;COUNT(*) 統計總行數ORDER BY col ASC:NULL 排最後 (視為最大值)ORDER BY col DESC:NULL 排最前NULLS FIRST、NULLS LASTORDER BY comm ASC NULLS FIRST 將 NULL 置頂錯誤:EXECUTE IMMEDIATE sql USING NULL; → PLS-00457: expressions have to be of SQL types (字面量 NULL 無型別)
解法 (任一):
USING '' (字串型)USING TO_NUMBER(NULL), TO_DATE(NULL), TO_CHAR(NULL)v_val NUMBER; EXECUTE IMMEDIATE sql USING v_val;| 特性 | Oracle | SQL Server |
|---|---|---|
| NULL 排序 (ASC) | 最後 | 最前 (視為最小值) |
空字串 '' | 視同 NULL | 非 NULL (長度 0 字串) |
NOT NULL 插入 '' | 失敗 | 成功 (插入空字串) |
INT 插入空值 | 失敗 | 自動轉 0 |
= NULL 比較 | 永遠 UNKNOWN | 受 SET ANSI_NULLS ON/OFF 控制 |
字串連接 + | || 忽略 NULL | SET CONCAT_NULL_YIELDS_NULL ON/OFF |
| 函數 | NVL, NVL2, COALESCE, NULLIF | ISNULL, COALESCE, NULLIF |
IS NULL / IS NOT NULL 判斷NVL(col, 0) 避免 NULL 干擾NULL 是關係資料庫最獨特的三值邏輯 (TRUE/FALSE/UNKNOWN) 來源,精通其行為差異是資深開發者與 DBA 的分水嶺。