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

SQL NULL 值處理:SQL Server 與 Oracle 函數對照與排序差異

     編輯:MySQL 資料庫相關知識

NULL 在 SQL 中代表「未知」,而非空字串或零。本文整理 SQL Server 與 Oracle 的 NULL 處理函數對照、比較邏輯、以及兩者在 ORDER BY 排序上的關鍵差異與解決方案。

NULL 替換函數對照

功能SQL ServerOracle
替換 NULL 為指定值ISNULL(expr, value)NVL(expr, value)
多參數依序取第一個非 NULLCOALESCE(expr1, expr2, ...)COALESCE(expr1, expr2, ...)

NULL 比較邏輯(兩者相同)

-- 正確寫法
WHERE column IS NULL
WHERE column IS NOT NULL

-- ❌ 錯誤寫法:永遠不會為真
WHERE column = NULL
WHERE column <> NULL

關鍵差異:ORDER BY 排序時 NULL 位置

資料庫升序 (ASC) 時 NULL 位置降序 (DESC) 時 NULL 位置
SQL Server最前面(視為最小值)最後面
Oracle最後面(視為最大值)最前面

統一排序行為:讓 SQL Server 像 Oracle 一樣

使用 CASE WHEN 強制控制排序順序:

SELECT id
FROM demo.dbo.orders
ORDER BY CASE WHEN id IS NULL THEN 1 ELSE 0 END, id

邏輯:先按「是否為 NULL」排序(非 NULL=0 排前面),再按實際值排序。

執行計畫影響

加上 CASE WHEN 可能導致索引無法使用(掃描取代尋找)。若該欄位有索引且查詢效能敏感,考慮:

  • 建立篩選索引:CREATE INDEX ... WHERE id IS NOT NULL
  • 或在應用層處理排序邏輯

實務建議

  • ✅ 統一使用 COALESCE(ANSI 標準,跨平台相容)
  • ✅ 明確指定 ORDER BY col ASC NULLS LAST(Oracle 12c+、PostgreSQL 支援)
  • ✅ 避免在 WHERE 條件對 NULL 欄位做運算(如 col + 1),結果會是 NULL
  • ✅ 設計表時評估是否允許 NULL,能用 NOT NULL 就加上
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved