在 Oracle 中,NULL 是獨立的實體,與任何非空值(含空字串 ''、數值 0)均無可比性。
NULL = '' → FALSENULL != '' → FALSENULL = 0 → FALSENULL > 0 → FALSENULL = NULL → FALSEIS NULL / IS NOT NULLSELECT * FROM t WHERE col = ''; -- 不會回傳 col 為 NULL 的列
SELECT * FROM t WHERE col IS NULL; -- 正確寫法
任何依賴 NULL 結果的比較表達式,最終結果皆為 NULL,Oracle 在 WHERE 中視為 FALSE,故不回傳資料列也不報錯。
INSERT INTO t (col) VALUES (''); -- 實際存入 NULL
SELECT * FROM t WHERE col = ''; -- 查無資料
SELECT * FROM t WHERE col IS NULL; -- 可查到
此行為與 SQL Server 不同(SQL Server 會真正存入空字串),遷移專案需特別注意。
NOT NULL 约束。NVL()、COALESCE()、NULLIF() 處理顯示與運算。CREATE INDEX idx_t_col ON t (NVL(col, 'NULL'));