sql - 相当于 Oracle XE 11.2 中 PostgreSQL 的 array_agg

标签 sql oracle postgresql oracle11gr2 array-agg

<分区>

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

最佳答案

除非您在存储过程中使用它来将输出保存为数组(或集合),否则使用 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

关于sql - 相当于 Oracle XE 11.2 中 PostgreSQL 的 array_agg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856440/

相关文章:

sql - oracle(或任何关系)数据模型问题。有固定数量 child 的 parent ?

postgresql - docker-compose 有一些问题

java - 在 QueryContext Oracle 的数字 varchar 字段中附加前导零

mysql ,带有点分隔符的别名字段,如 postgresql

sql - 如何从 PostgreSQL 中的 sql 脚本导入外部 sql 脚本?

mysql - SQL : How do I sum all null values into another value of specific row?

SQL LIKE 运算符在存储的 JSON 中查找单词

php - Mysql餐厅菜单

java - 使用 MyBatis 调用 Oracle 存储过程

mysql - 强制表参与的最佳方式