7

我有一个 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 中获得相同的结果?

4

2 回答 2

9

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

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

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

首先,创建一个集合TYPE

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

现在,运行这个查询相当于使用string_aggor LISTAGG,虽然categories是一个数组或集合,而不是一个字符串。

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

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

演示

于 2017-12-17T17:53:40.780 回答
1

Oracle 的功能listagg()非常接近 Postgres 的string_agg(). 两者似乎都在做你想做的事。

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

于 2017-12-17T15:41:57.410 回答