Oracle 空白字元 和 NULL
Contents
Oracle 有一個與其他主流資料庫非常不同的特性:空字串(’’)在 Oracle 中等同於 NULL。這個行為符合 Oracle 自己的實作,但不符合 ANSI SQL 標準,是從其他資料庫遷移到 Oracle 時最常踩到的地雷之一。
Oracle 的空字串行為
在 Oracle 中,插入空字串 ’’ 時,資料庫會自動將其轉為 NULL:
|
|
因此,用 WHERE name = ’’ 查詢永遠找不到任何資料(因為 NULL = NULL 在 SQL 中是 UNKNOWN,不是 TRUE):
|
|
與其他資料庫的差異
| 資料庫 | ’’ 的行為 |
|---|---|
| Oracle | ’’ = NULL,空字串會自動轉為 NULL |
| MySQL | ’’ 是空字串,與 NULL 不同 |
| SQL Server | ’’ 是空字串,與 NULL 不同 |
| PostgreSQL | ’’ 是空字串,與 NULL 不同 |
這表示在 MySQL 或 SQL Server 中正常運作的查詢,移植到 Oracle 後行為可能完全不同。
NULL 處理函式
NVL:NULL 替換預設值
NVL(expr, default_value):如果 xpr 是 NULL,回傳 default_value,否則回傳 xpr。
|
|
NVL2:根據是否為 NULL 回傳不同值
NVL2(expr, not_null_value, null_value):如果 xpr 不是 NULL 回傳
ot_null_value,否則回傳
ull_value。
|
|
NULLIF:兩值相同時回傳 NULL
NULLIF(expr1, expr2):如果兩個值相等,回傳 NULL;否則回傳 xpr1。
|
|
COALESCE:回傳第一個非 NULL 值
COALESCE 是 ANSI SQL 標準函式,Oracle 也支援:
|
|
資料庫遷移注意事項
從 MySQL/SQL Server 遷移到 Oracle 時,需要特別檢查:
- 所有用 = ’’ 比較空字串的地方,改為 IS NULL
- 所有 INSERT INTO … VALUES (’’) 的資料,在 Oracle 中實際上儲存為 NULL
- 所有 != ’’ 的條件,改為 IS NOT NULL