2017-08-09 54 views
1

我有下面的表:是否有任何Oracle內置函數按特定順序連接多個字段?

Col1|Col2|Col3 
C |B |A 
B |A |C 
A |D |B 

,並希望有串接升序排列在Col1中,col2的和COL3值的查詢。 例如上表的輸出應爲:

Result 
ABC 
ABC 
ABD 

Oracle是否提供了任何內置函數來按特定順序聚合多個字段?

+0

結帳Gordon的回答。如果您的後續行動是針對4列進行的,那麼我建議您在_rows_而不是列中獲取這些值。 Oracle非常適合對記錄進行排序,對於列來說更是如此。 –

回答

2

號你可以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) 
0

沒有,但你可以工作的方式與現有的工具組合來做到這一點。

此方法使用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 
+0

看起來像你,我想出了同一主題的變化:-) – Kirby

+0

確實,但你的答案仍然是一個不同的方式。皮膚有很多種方法可以讓貓變得美麗,偉大的思想家也會這樣想! – SandPiper

1

這個查詢會做的工作,而且它可以擴展到列的任意數量:

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岩石!

+0

對我來說是正確的。 – SandPiper

相關問題