Oracle
Oracle union 預設排序很奇怪
如您所知,
union
刪除重複的行。我認為它會從後者中刪除,但事實並非如此。我發現如果沒有
order by
子句,Oracle 會按第一列對合併的數據集進行排序並刪除重複項。select 4,5,6 from dual union select 1,2,3 from dual union select 4,5,6 from dual
結果:
1 2 3 4 5 6
而我期望:
4 5 6 1 2 3
我失敗了很多次,就像上面的例子一樣讓問題變得簡單。
如何在沒有 的情況下保持聯合序列
order by
?在我的真實案例中,第一個
select
是完全匹配(=
)結果,第二個是部分匹配(like
)結果。例如,如果我搜尋羅馬。
完全匹配結果:roma,部分匹配結果:aroma。
當然,完整的比賽結果應該是第一位的。正如我所說,這似乎
order by
是結果的第一列union
。但是,如您所見:
select 'roma' from dual -- result comes out anyway.. union select 'aroma' from dual;
結果:
aroma roma
香氣按字母順序排在羅馬之前,它排在第一位。
也許我應該嘗試
union all
刪除重複項?
正如已經不止一次提到的那樣,如果不使用 ORDER BY 子句顯式指定該順序,就不能期望行按特定順序排列。
對於您的問題中描述的問題,您實際上根本不需要 UNION。僅使用 LIKE 條件來覆蓋全部和部分匹配:
WHERE name LIKE '%roma%'
然後使用條件表達式根據匹配是完全匹配還是部分匹配對行進行排名,使用 DECODE 函式,例如:
ORDER BY DECODE(name, 'roma', 1, 2) ASC
或 CASE 表達式,對於另一個:
ORDER BY CASE name WHEN 'roma' THEN 1 ELSE 2 END ASC