ORDER BY 預設視 NULL 為最大值 (ASC 最後、DESC 最前)。實務常需自訂 NULL 排序位置,五大方法如下:
| 方法 | 語法範例 | 適用場景 | 優缺點 |
|---|---|---|---|
| 1. 預設 | ORDER BY col ASC | 無特殊需求 | NULL 視為最大值 |
| 2. NVL | ORDER BY NVL(col, '張三') | 單一替代值 | 簡單,但替代值需與欄位型別相容 |
| 3. DECODE | ORDER BY DECODE(col, NULL, '張三', col) | 單一替代值,邏輯更清晰 | 功能同 NVL,可讀性略好 |
| 4. CASE | ORDER BY CASE WHEN col IS NULL THEN '張三' ELSE col END | 複雜條件、多重替代 | 最靈活,支援任意運算式 |
| 5. NULLS FIRST/LAST (9i+) | ORDER BY col NULLS FIRSTORDER BY col DESC NULLS LAST | 純粹控制 NULL 位置,不改值 | 語義最清晰、效能最佳、不需轉型 |
-- 5.1 NULL 永遠排最前 (不論 ASC/DESC)
SELECT * FROM zl_cbqc ORDER BY cb_ld NULLS FIRST;
-- 5.2 NULL 永遠排最後
SELECT * FROM zl_cbqc ORDER BY cb_ld DESC NULLS LAST;
-- 4. CASE 進階:NULL 排中間,特定值排最前
SELECT * FROM emp
ORDER BY CASE
WHEN ename = 'KING' THEN 1
WHEN ename IS NULL THEN 2
ELSE 3
END, ename;
NULLS FIRST/LAST:語法簡潔、語義明確、無型別轉換風險、優化器最易識別。CASE (9i+) 或 DECODE。NVL 於排序中使用,因替代值可能改變排序語義 (如數值欄位 NVL 為 0 會干擾實際 0 值)。掌握 NULL 排序控制,能讓報表與應用呈現符合業務預期的資料順序。