首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleXE11.2中PostgreSQL的array_agg等效

OracleXE11.2中PostgreSQL的array_agg等效
EN

Stack Overflow用户
提问于 2017-12-17 15:10:23
回答 2查看 6.7K关注 0票数 7

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

代码语言:javascript
复制
ID   Category
1    Cat1
1    Cat2
2    Cat3
2    Cat4

我想得到与逗号相同的所有相关类别的不同id,如下所示

代码语言:javascript
复制
ID   Categories
1    Cat1,Cat2
2    Cat3,Cat4

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-17 17:53:40

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

代码语言:javascript
复制
select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories
FROM yourtable GROUP BY ID;

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

首先,创建一个集合TYPE

代码语言:javascript
复制
create or replace TYPE categorytype as TABLE OF VARCHAR2(20);

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

代码语言:javascript
复制
select id, CAST ( COLLECT(Category) as categorytype ) categories
FROM yourtable group by id;

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

DEMO

票数 9
EN

Stack Overflow用户

发布于 2017-12-17 15:41:57

甲骨文有一个函数listagg(),它非常接近Postgres的string_agg()。两人似乎都在做你想做的事。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47856440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档