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

Oracle NULL 排序控制:讓空值優先顯示的兩種寫法

     編輯:Oracle 資料庫相關知識

問題

Oracle 預設 ORDER BY col ASC 將 NULL 視為最大值置於最後,業務需求要求空值優先顯示。

方案一:UNION 分組排序(適用舊版/複雜邏輯)

SELECT * FROM (
  SELECT a.*, ROWNUM my_sys_rownum FROM (
    SELECT deptid, NVL(bdzname,' '), NVL(vollevel,'0'), zbrl, NVL(zbts,'0'),
           NVL(fzr,'0'), NVL(deptiddes,' '), NVL(tel,' '), NVL(runstatedes,' '),
           NVL(address,' '), bdzid
    FROM v_bdz WHERE ROWNUM < 2000 AND zbrl IS NULL
  ) a
  UNION
  SELECT b.*, ROWNUM + (SELECT COUNT(*) FROM ...) my_sys_rownum FROM (
    SELECT deptid, NVL(bdzname,' '), NVL(vollevel,'0'), zbrl, NVL(zbts,'0'),
           NVL(fzr,'0'), NVL(deptiddes,' '), NVL(tel,' '), NVL(runstatedes,' '),
           NVL(address,' '), bdzid
    FROM v_bdz WHERE ROWNUM < 2000 AND zbrl IS NOT NULL ORDER BY zbrl
  ) b
) ORDER BY my_sys_rownum DESC;

邏輯:先查 NULL 群組,再查非 NULL 群組排序,合併後人工分配行號。

方案二:NVL 轉換排序鍵(簡潔、高效,推薦)

SELECT * FROM table_name
ORDER BY NVL(sort_column, '-1');  -- 數值型用 -1,字串型用 ' ' 或 CHR(0)

將 NULL 替換為比正常值更小的值,自然排在最前。

進階:NULLS FIRST/LAST 語法(10g+)

ORDER BY sort_column ASC NULLS FIRST;   -- 空值在前
ORDER BY sort_column DESC NULLS LAST;   -- 空值在後

標準 SQL 語法,語意最清晰,效能與 NVL 相當。

小結

現代 Oracle 版本首選 NULLS FIRST;舊版或需相容性時用 NVL(col, min_value);複雜分組邏輯可用 UNION 方案。

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