我有下面的表:是否有任何Oracle內置函數按特定順序連接多個字段?
Col1|Col2|Col3
C |B |A
B |A |C
A |D |B
,並希望有串接升序排列在Col1中,col2的和COL3值的查詢。 例如上表的輸出應爲:
Result
ABC
ABC
ABD
Oracle是否提供了任何內置函數來按特定順序聚合多個字段?
我有下面的表:是否有任何Oracle內置函數按特定順序連接多個字段?
Col1|Col2|Col3
C |B |A
B |A |C
A |D |B
,並希望有串接升序排列在Col1中,col2的和COL3值的查詢。 例如上表的輸出應爲:
Result
ABC
ABC
ABD
Oracle是否提供了任何內置函數來按特定順序聚合多個字段?
號你可以least()
和greatest()
和case
做到這一點:
select least(col1, col2, col3) ||
(case when col1 not in (least(col1, col2, col3), greatest(col1, col2, col3)) then col1
when col2 not in (least(col1, col2, col3), greatest(col1, col2, col3)) then col2
else col3
end) ||
greatest(col1, col2, col3)
沒有,但你可以工作的方式與現有的工具組合來做到這一點。
此方法使用UNION運算符將所有記錄放入單個列中,同時將它們與它們來自的ROWNUM相關聯,然後使用LISTAGG函數將組合在最終結果集中。
WITH view1 AS (SELECT ROWNUM AS rowid, col1 as col FROM table
UNION ALL
SELECT ROWNUM, col2 FROM table
UNION ALL
SELECT ROWNUM, col3 FROM table)
SELECT LISTAGG(col, '') WITHIN GROUP (ORDER BY col) OVER (PARTITION BY rowid) AS Result
FROM view1
這個查詢會做的工作,而且它可以擴展到列的任意數量:
Select Listagg(col_val) Within Group (Order By col_val) As sorted_col_values
From (Select col1, col2, col3,
rowid as row_id
From t)
Unpivot(col_val For col in (col1, col2, col3))
Group By row_id;
UNPIVOT運算符的每一行的三列轉換爲三個不同的行,每行相同的行ID。 Listagg函數與GROUP BY on row_id一起將每行的列值鏈接在一起,並按字母順序排列。
我知道你在想什麼,我同意:Oracle岩石!
對我來說是正確的。 – SandPiper
結帳Gordon的回答。如果您的後續行動是針對4列進行的,那麼我建議您在_rows_而不是列中獲取這些值。 Oracle非常適合對記錄進行排序,對於列來說更是如此。 –