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

时间:2019-03-26 10:46:45

标签: sql oracle string-aggregation

我有一个表,其中包含以下数据:

Orange
Apple
PineApple
Grapes

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

我不能使用LISTAGG功能,因为我不想更改数据的顺序

如何实现?

1 个答案:

答案 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返回行的顺序。如果要求排序,则必须将其应用于数据,而不是假定隐式生成行的顺序。)