>>824 非 NULL な列をソートして、それに NULL な列を union で追加する、
つまり
(SELECT ... FROM pub WHERE publish_date IS NOT NULL ORDER BY publish_date DESC)
UNION ALL
SELECT ... FROM pub WHERE publish_date IS NULL;
ではどうだろう?
Oracle のマニュアルが手元にないから、構文が違っているかもしれないが。
# PostgreSQL では動いた。