如何在不更改顺序的情况下从多行中获取一个逗号分隔的行

how to get one comma separated row from multiple rows in oracle without changing the order

我有一个 table,其中包含如下数据:

Orange
Apple
PineApple
Grapes

我想要的最终输出是:Orange,Apple,PineApple,Grapes

我无法使用 LISTAGG 函数,因为我不想更改数据出现的顺序

如何实现?

使用 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<>fiddle here

(注意:table 中的行以不确定的顺序检索并更改 table 中的数据,从备份中恢复 table或启用行移动可以更改 Oracle 将 return 行的顺序。如果您需要排序,则必须将其应用于数据,而不是假定生成行的隐式顺序。)