2016-02-22 53 views
0

我有一個基於第二列對結果進行排序的查詢。根據另一列爲空來更改結果集順序

select decode(name, null, 'n/a', name) name, value1 
from tableA 
group by name 
order by 2 

我能怎樣改變這樣的結果,其中第一欄爲空總是在結果集中的最後一行,在不改變順序對結果的休息嗎?

一個解決方案我在我的腦海是使用聯合兩個查詢,一個不包括空值和一個只具有空值,是這樣的:

select decode(name, null, 'n/a', name) name, value1 
from tableA 
where name is not null 
group by name 
union 
select decode(name, null, 'n/a', name) name, value1 
from tableA 
where name is null 
group by name 
order by 2 

有沒有更好的方式來做到這一點?

+0

除非使用「order by」子句,否則Oracle中不存在像第n行或最後一行這樣的事情。作爲最後一個插入的行可以放置在具有足夠可用空間的中間的數據塊之一中... – MaxU

回答

2

您的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子句,因爲您沒有任何聚合,並且您的查詢都不是有效的;但是如果需要的話,您仍然可以在真正的查詢中進行分組和執行此操作。)

+0

訂單優先級在第2列desc上,因爲第1列值按該順序落入,所以我需要提取column1值爲null的行,然後將其附加在底部,我不想破壞第二列的順序。 \t 我不需要一個case case語句,我可以按'last by last last'給出你給我的結果 – user525146

+0

這不會破壞每個null/not null塊的column2順序。這與'最後1個空位的秩序'不一樣;將每個單獨的值考慮在內,然後進行排序。在這種情況下,它是一個二元空/非空標誌。它會將第一列爲空的行放在結果集的末尾。 –

+0

道歉,你是對的,我忽略了價值..我做了這個訂單value1 desc – user525146