您的union
方法不會得到您想要的結果;在兩個查詢聯合後應用order by
,因此它們的排序方式與您有單個查詢相同。您可以在聯合的每個佈局中添加一個標誌列,並將其包含在排序中,但是您需要將其從最終選擇列表中排除。
你可以在order by clause
中使用case語句(或者,如果你願意的話,可以解碼)對第一列進行處理,該列將所有非空值視爲一個優先級,而不考慮實際值,所有空值視爲不同的優先級;然後進一步的命令通過柱2:
select decode(a.name, null, 'n/a', a.name) name, value1
from tableA a
order by case when a.name is null then 1 else 0 end, value1 desc
我使用表別名和包含在的情況下避免原始表值和相同的名稱的列別名之間的混淆。這將在所有不爲null的所有結果之後放置所有帶有空('n/a')名稱的結果;並且在每個類別中,所有結果仍將按第二列進行排序。
有了一些樣本數據:
with tableA (name, value1) as (
select 'Joe', 3 from dual
union all select 'Anne', 10 from dual
union all select null, 4 from dual
union all select 'Sarah', 2 from dual
union all select 'Bill', 5 from dual
union all select 'Mary', 7 from dual
)
...第二列剛剛訂購獲得:
select decode(a.name, null, 'n/a', a.name) name, value1
from tableA a
order by value1 desc;
NAME VALUE1
----- ----------
Anne 10
Mary 7
Bill 5
n/a 4
Joe 3
Sarah 2
添加這種情況下條款提出你的 'N/A' 行最後的結果設置:
select decode(a.name, null, 'n/a', a.name) name, value1
from tableA a
order by case when a.name is null then 1 else 0 end, value1 desc;
NAME VALUE1
----- ----------
Anne 10
Mary 7
Bill 5
Joe 3
Sarah 2
n/a 4
(我已經忽略了您的示例中的group by子句,因爲您沒有任何聚合,並且您的查詢都不是有效的;但是如果需要的話,您仍然可以在真正的查詢中進行分組和執行此操作。)
除非使用「order by」子句,否則Oracle中不存在像第n行或最後一行這樣的事情。作爲最後一個插入的行可以放置在具有足夠可用空間的中間的數據塊之一中... – MaxU