我有一个包含以下列的表:
Col1|Col2|Col3
C |B |A
B |A |C
A |D |B
并希望有一个以升序连接Col1、Col2和Col3中的值的查询。例如,上表的输出应为:
Result
ABC
ABC
ABD
Oracle是否提供了以特定顺序聚合多个字段的内置函数?
发布于 2017-08-09 10:45:25
不是的。您可以使用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)
发布于 2017-08-09 12:09:41
此查询将完成此工作,并且可以扩展到任意数量的列:
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;
取消透视运算符将每行的三列转换为三个不同的行,每行具有相同的行ID。Listagg函数与row_id上的Group By结合使用,可将每行的列值重新链接在一起,并按字母顺序排序。
我知道你在想什么,我同意:甲骨文太棒了!
发布于 2017-08-09 11:59:13
不能,但您可以通过现有工具的组合找到一种方法。
此方法使用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
https://stackoverflow.com/questions/45580833
复制相似问题