相当于 Oracle XE 11.2 中 PostgreSQL 的 array_agg
Equivalent of PostgreSQL's array_agg in Oracle XE 11.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 中获得相同的结果?
Oracle 有一个函数 listagg()
,它非常接近 Postgres 的 string_agg()
。两者似乎都在做你想做的事。
但是,array_agg()
使用 SQL 表达式创建了一个数组。我认为 Oracle 在 SQL 语句中不支持数组作为本机类型(尽管数组是 PL/SQL 的一部分)。因此没有等价物。
除非您在存储过程中使用它来将输出保存为数组(或集合),否则使用 LISTAGG
的查询应该就足够了,并且会给出相同的输出。
select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories
FROM yourtable GROUP BY ID;
在oracle中,我们没有像array_agg
那样直接的转换函数。但是,您可以创建用户定义的集合类型,然后使用 CAST
和 COLLECT
函数将其转换为 NESTED TABLE
以获得相同的所需输出。
首先,创建一个集合TYPE
。
create or replace TYPE categorytype as TABLE OF VARCHAR2(20);
现在,运行这个查询相当于使用string_agg
或LISTAGG
,尽管categories
是一个数组或集合,而不是字符串。
select id, CAST ( COLLECT(Category) as categorytype ) categories
FROM yourtable group by id;
| ID | CATEGORIES |
|----|------------|
| 1 | Cat1,Cat2 |
| 2 | Cat3,Cat4 |
我有一个 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 中获得相同的结果?
Oracle 有一个函数 listagg()
,它非常接近 Postgres 的 string_agg()
。两者似乎都在做你想做的事。
但是,array_agg()
使用 SQL 表达式创建了一个数组。我认为 Oracle 在 SQL 语句中不支持数组作为本机类型(尽管数组是 PL/SQL 的一部分)。因此没有等价物。
除非您在存储过程中使用它来将输出保存为数组(或集合),否则使用 LISTAGG
的查询应该就足够了,并且会给出相同的输出。
select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories
FROM yourtable GROUP BY ID;
在oracle中,我们没有像array_agg
那样直接的转换函数。但是,您可以创建用户定义的集合类型,然后使用 CAST
和 COLLECT
函数将其转换为 NESTED TABLE
以获得相同的所需输出。
首先,创建一个集合TYPE
。
create or replace TYPE categorytype as TABLE OF VARCHAR2(20);
现在,运行这个查询相当于使用string_agg
或LISTAGG
,尽管categories
是一个数组或集合,而不是字符串。
select id, CAST ( COLLECT(Category) as categorytype ) categories
FROM yourtable group by id;
| ID | CATEGORIES |
|----|------------|
| 1 | Cat1,Cat2 |
| 2 | Cat3,Cat4 |