如何在不更改顺序的情况下从多行中获取一个逗号分隔的行
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 行的顺序。如果您需要排序,则必须将其应用于数据,而不是假定生成行的隐式顺序。)
我有一个 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 行的顺序。如果您需要排序,则必须将其应用于数据,而不是假定生成行的隐式顺序。)