首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 與 Oracle NULL 值深度解析:比較規則、函數處理、索引影響、排序行為、動態 SQL 綁定陷阱

     編輯:Oracle 資料庫相關知識

NULL 代表「未知」,而非「空」或「零」。Oracle 與 SQL Server 對 NULL 的處理存在關鍵差異。本文系統整理 NULL 的核心特性、比較邏輯真值表、NVL/COALESCE 函數族、索引與排序行為、動態 SQL 綁定 NULL 陷阱、與 SQL Server 差異對比。

一、NULL 核心特性 (Oracle)

  • 等價於「無值、未知」,長度為零
  • 允許任何型別欄位為 NULL,除 PRIMARY KEY、NOT NULL 約束欄位
  • NULL ≠ 0 ≠ '' ≠ ' ' (空字串在 Oracle 視同 NULL)
  • 算術運算:NULL + 10 = NULL,結果仍為 NULL
  • 字串連接:NULL || 'abc' = 'abc',CONCAT(NULL, 'abc') = 'abc' (忽略 NULL)

二、比較與判斷真值表

運算式結果說明
NULL = NULLUNKNOWN (顯示為無行)任何與 NULL 比較 (=, <>, <, >) 均為 UNKNOWN
NULL IS NULLTRUE唯一正確判斷 NULL 的方式
NULL IS NOT NULLFALSE
NVL(NULL, 0) = NVL(NULL, 0)TRUE轉換後比較
'' = ''UNKNOWNOracle 空字串即 NULL

NULL 比較規則總結表

三、NULL 相關函數族

函數語法邏輯範例
NVLNVL(expr1, expr2)expr1 為 NULL 回傳 expr2,否則 expr1NVL(comm, 0)
NVL2NVL2(expr1, expr2, expr3)expr1 NULL 回傳 expr3,否則 expr2NVL2(comm, 'Y', 'N')
NULLIFNULLIF(expr1, expr2)相等回傳 NULL,否則 expr1 (型別必須相同)NULLIF(1, 1) → NULL
COALESCECOALESCE(expr1, expr2, ...)回傳第一個非 NULL 參數 (型別需一致)COALESCE(comm, sal, 0)

類型轉換規則:NVL2 以 expr2 為準;COALESCE 要求所有參數同型別,隱式轉換失敗報錯 ORA-01722。

四、NULL 與索引

  • B*Tree 索引不儲存全 NULL 的索引鍵
  • 唯一索引允許多行全 NULL (視為不同值)
  • WHERE col IS NULL 無法使用該欄位的 B*Tree 索引 (需建立函數索引 NVL(col, 'NULL') 或位圖索引)
  • COUNT(col) 忽略 NULL,統計非 NULL 行數;COUNT(*) 統計總行數

五、NULL 排序行為

  • ORDER BY col ASC:NULL 排最後 (視為最大值)
  • ORDER BY col DESC:NULL 排最前
  • 控制關鍵字:NULLS FIRST、NULLS LAST
  • 範例:ORDER BY comm ASC NULLS FIRST 將 NULL 置頂

六、動態 SQL 綁定 NULL 陷阱 (PL/SQL)

錯誤:EXECUTE IMMEDIATE sql USING NULL; → PLS-00457: expressions have to be of SQL types (字面量 NULL 無型別)

解法 (任一):

  1. 空字串:USING '' (字串型)
  2. 型別轉換:USING TO_NUMBER(NULL), TO_DATE(NULL), TO_CHAR(NULL)
  3. 未初始化變數:v_val NUMBER; EXECUTE IMMEDIATE sql USING v_val;

七、SQL Server 差異對比

特性OracleSQL Server
NULL 排序 (ASC)最後最前 (視為最小值)
空字串 ''視同 NULL非 NULL (長度 0 字串)
NOT NULL 插入 ''失敗成功 (插入空字串)
INT 插入空值失敗自動轉 0
= NULL 比較永遠 UNKNOWN受 SET ANSI_NULLS ON/OFF 控制
字串連接 +|| 忽略 NULLSET CONCAT_NULL_YIELDS_NULL ON/OFF
函數NVL, NVL2, COALESCE, NULLIFISNULL, COALESCE, NULLIF

八、最佳實踐原則

  1. 永遠使用 IS NULL / IS NOT NULL 判斷
  2. 聚合統計用 NVL(col, 0) 避免 NULL 干擾
  3. 唯一索引欄位避免全 NULL (或改用部分索引/函數索引)
  4. 動態 SQL 綁定傳入型別化的 NULL 值
  5. 跨資料庫開發時,明確 NULL 語義差異,編寫可移植邏輯

NULL 是關係資料庫最獨特的三值邏輯 (TRUE/FALSE/UNKNOWN) 來源,精通其行為差異是資深開發者與 DBA 的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved