在Oracle XE 11.2中等效PostgreSQL的array_agg [重复]

问题描述 投票:4回答:2

这个问题在这里已有答案:

我有一个Oracle 11g XE数据库,我有一个查询结果集:

ID   Category
1    Cat1
1    Cat2
2    Cat3
2    Cat4

我希望得到不同的id,其中所有相关类别都在逗号分隔的同一行中

ID   Categories
1    Cat1,Cat2
2    Cat3,Cat4

我之前使用的是Postgres,array_agg帮助了我。如何在Oracle 11g XE中获得相同的结果?

sql oracle postgresql oracle11gr2 array-agg
2个回答
4
投票

除非您在存储过程中使用它将输出保存为数组(或集合),否则使用LISTAGG的查询应该足够并提供相同的输出。

select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories
FROM yourtable GROUP BY ID;

在oracle中,我们没有像array_agg这样简单的转换函数。但是,您可以创建用户定义的集合类型,然后使用CASTCOLLECT函数将其转换为NESTED TABLE以获得相同的所需输出。

首先,创建一个集合TYPE

create or replace TYPE categorytype as TABLE OF VARCHAR2(20);

现在,运行此查询等同于使用string_aggLISTAGG,尽管categories是一个数组或集合,而不是字符串。

select id, CAST ( COLLECT(Category) as categorytype ) categories
FROM yourtable group by id;

| ID | CATEGORIES |
|----|------------|
|  1 |  Cat1,Cat2 |
|  2 |  Cat3,Cat4 |

DEMO


0
投票

Oracle有一个功能listagg(),它非常接近Postgres的string_agg()。两者似乎都做你想做的事。

但是,array_agg()使用SQL表达式创建一个数组。我不认为Oracle在SQL语句中支持数组作为本机类型(尽管数组是PL / SQL的一部分)。因此,没有相应的。

© www.soinside.com 2019 - 2024. All rights reserved.