等效于Oracle XE 11.2中PostgreSQL的array_agg

Mur*_*lto 5 sql oracle postgresql oracle11gr2 array-agg

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

ID   Category
1    Cat1
1    Cat2
2    Cat3
2    Cat4
Run Code Online (Sandbox Code Playgroud)

我想像这样用逗号分隔同一行中所有相关类别的唯一ID

ID   Categories
1    Cat1,Cat2
2    Cat3,Cat4
Run Code Online (Sandbox Code Playgroud)

我以前使用过Postgres,并array_agg在那里提供了帮助。在Oracle 11g XE中如何获得相同的结果?

Kau*_*yak 6

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

select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories
FROM yourtable GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)

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

首先,创建一个集合TYPE

create or replace TYPE categorytype as TABLE OF VARCHAR2(20);
Run Code Online (Sandbox Code Playgroud)

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

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

| ID | CATEGORIES |
|----|------------|
|  1 |  Cat1,Cat2 |
|  2 |  Cat3,Cat4 |
Run Code Online (Sandbox Code Playgroud)

演示