Oracle 預設 ORDER BY col ASC 將 NULL 視為最大值置於最後,業務需求要求空值優先顯示。
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 群組排序,合併後人工分配行號。
SELECT * FROM table_name
ORDER BY NVL(sort_column, '-1'); -- 數值型用 -1,字串型用 ' ' 或 CHR(0)
將 NULL 替換為比正常值更小的值,自然排在最前。
ORDER BY sort_column ASC NULLS FIRST; -- 空值在前
ORDER BY sort_column DESC NULLS LAST; -- 空值在後
標準 SQL 語法,語意最清晰,效能與 NVL 相當。
現代 Oracle 版本首選 NULLS FIRST;舊版或需相容性時用 NVL(col, min_value);複雜分組邏輯可用 UNION 方案。