NULL 在 SQL 中代表「未知」,而非空字串或零。本文整理 SQL Server 與 Oracle 的 NULL 處理函數對照、比較邏輯、以及兩者在 ORDER BY 排序上的關鍵差異與解決方案。
| 功能 | SQL Server | Oracle |
|---|---|---|
| 替換 NULL 為指定值 | ISNULL(expr, value) | NVL(expr, value) |
| 多參數依序取第一個非 NULL | COALESCE(expr1, expr2, ...) | COALESCE(expr1, expr2, ...) |
-- 正確寫法
WHERE column IS NULL
WHERE column IS NOT NULL
-- ❌ 錯誤寫法:永遠不會為真
WHERE column = NULL
WHERE column <> NULL
| 資料庫 | 升序 (ASC) 時 NULL 位置 | 降序 (DESC) 時 NULL 位置 |
|---|---|---|
| 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 NULLCOALESCE(ANSI 標準,跨平台相容)ORDER BY col ASC NULLS LAST(Oracle 12c+、PostgreSQL 支援)col + 1),結果會是 NULLNOT NULL 就加上