我有一个表,其中包含以下数据:
Orange
Apple
PineApple
Grapes
我想要的最终输出是:Orange,Apple,PineApple,Grapes
我不能使用LISTAGG
功能,因为我不想更改数据的顺序。
如何实现?
答案 0 :(得分:3)
使用LISTAGG
并按ROWNUM
进行排序以保留现有订单:
Oracle设置:
CREATE TABLE your_table ( value, order_index ) AS
SELECT 'Orange', 1 FROM DUAL UNION ALL
SELECT 'Apple', 2 FROM DUAL UNION ALL
SELECT 'PineApple', 3 FROM DUAL UNION ALL
SELECT 'Grapes', 4 FROM DUAL;
查询:
WITH pre_ordered_values ( value ) AS (
SELECT value FROM your_table ORDER BY order_index
)
SELECT LISTAGG( value, ',' ) WITHIN GROUP ( ORDER BY ROWNUM ) AS aggregated_values
FROM pre_ordered_values
输出:
| AGGREGATED_VALUES | | :---------------------------- | | Orange,Apple,PineApple,Grapes |
db <>提琴here
(注:表中的行以不确定的顺序检索并更改表中的数据,从备份中还原表或启用行移动都可以更改Oracle返回行的顺序。如果要求排序,则必须将其应用于数据,而不是假定隐式生成行的顺序。)