【问题标题】:Equivalent of PostgreSQL's array_agg in Oracle XE 11.2 [duplicate]相当于 Oracle XE 11.2 中 PostgreSQL 的 array_agg [重复]
【发布时间】:2018-05-31 02:04:12
【问题描述】:

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

【问题讨论】:

  • tl;dr - LISTAGG() 已添加到 11g 中,将为您提供所需的结果集。

标签: sql oracle postgresql oracle11gr2 array-agg


【解决方案1】:

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

【讨论】:

  • 非常感谢伙计。你的建议对我有用。
  • 我在表格中添加了以下两条记录: INTO yourtable (ID, Category) VALUES (2, 'Cat4') INTO yourtable (ID, Category) VALUES (2, 'Cat4') when i使用 listagg 查询我得到 2 Cat3,Cat4,Cat4i,Cat4 结果。如何避免 listagg 中的重复值?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多