NULL在Oracle中代表「未知」而非「空」,其特殊行為常導致查詢結果偏差。本文通過實測案例,系統梳理NULL的七大核心特性、運算規則、索引限制與正確處理模式。
| 特性 | 說明 |
|---|---|
| 本質 | 未知值,長度為0,非0、非空字串、非空格 |
| 約束限制 | 主鍵欄位、NOT NULL欄位不可為NULL |
| 運算結果 | 任何算術運算(+ - * /)遇NULL結果皆為NULL |
| 比較邏輯 | 僅能用IS NULL/IS NOT NULL;=NULL、<>NULL永不為真 |
| 轉換函數 | 推薦NVL(col, default)或COALESCE |
| 索引行為 | B-tree索引不存儲全NULL鍵值,導致WHERE col IS NULL無法走索引 |
| 排序順序 | 預設升序(ASC)時NULL排最後;降序(DESC)排最前 |
-- 錯誤示範:全回傳0行
SELECT 1 FROM dual WHERE NULL = NULL;
SELECT 1 FROM dual WHERE NULL = '';
SELECT 1 FROM dual WHERE '' = '';
-- 正確寫法:回傳1行
SELECT 1 FROM dual WHERE NULL IS NULL;
SELECT 1 FROM dual WHERE NVL(NULL,0) = NVL(NULL,0);
SELECT 1+NULL, 1-NULL, 1*NULL, 1/NULL FROM dual; -- 全部回傳NULL
CREATE TABLE sale (month CHAR(6), sell NUMBER);
INSERT INTO sale VALUES ('200009', NULL); -- 9月無銷售資料
COMMIT;
錯誤查詢:SELECT * FROM sale WHERE sell LIKE '%'; → 漏掉NULL行(僅11筆)。
正確寫法:
-- 寫法1:顯式OR條件
SELECT * FROM sale WHERE sell LIKE '%' OR sell IS NULL;
-- 寫法2:NVL轉換(推薦,可走索引)
SELECT * FROM sale WHERE NVL(sell,0) LIKE '%';
結果:完整回傳12筆資料。
DEFAULT 0或DEFAULT 'N/A'並加NOT NULL約束。COUNT(*)含NULL行,COUNT(col)忽略NULL;需用COUNT(NVL(col,0))。LEFT JOIN並處理NULL顯示邏輯。理解NULL的三值邏輯(TRUE/FALSE/UNKNOWN)與存儲機制,是編寫正確、高效SQL的基石。