【问题标题】:What's the equivalent for LISTAGG (Oracle database) in PostgreSQL?PostgreSQL 中的 LISTAGG(Oracle 数据库)的等价物是什么?
【发布时间】:2015-06-15 22:39:39
【问题描述】:

我必须用最新的 PostgreSQL 替换 Oracle 驱动程序。 PostgreSQL 不知道函数 LISTAGG。我必须以逗号分隔concat 值。 PostgreSQL 中的 Oracle 函数 LISTAGG 的等价物是什么?

【问题讨论】:

  • 一个简单的谷歌搜索,我在顶部找到了postgresonline.com/journal/archives/…
  • 为什么不直接查看手册中的 "Aggregate Functions" 章节?
  • 只需创建一个:CREATE FUNCTION LISTAGG....
  • @FrankHeikens 为什么要创建一个函数? LISTAGG 是 Oracle 11g 及更高版本中的内置函数
  • @LalitKumarB:如果你想在 PostgreSQL 中使用相同的函数名,你必须创建它。这个问题不是关于 Oracle 中的标准函数,而是关于 PostgreSQL 中具有不同名称的函数。你可以创建一个同名的函数,这样你就不必改变你当前的代码了。

标签: sql postgresql string-aggregation listagg


【解决方案1】:

PostgreSQL 中的等效函数是STRING_AGG()

SELECT STRING_AGG (column_name,', ') 
FROM my_table

string_agg : 输入值连接成一个字符串,用分隔符分隔

例如,获取所有agreement_id 的列表,然后在 Apache Ofbiz 17.12.04 中将其表示为字符串

SELECT STRING_AGG(agreement_id, ', ') FROM agreement_item;

-- result
-- "8000, DS-1000-SALES, DS-1000-PURCH, 9000, AGR_SALES"

【讨论】:

  • (SELECT c_id, STRING_AGG(c_grp_id, ',') WITHIN GROUP (ORDER BY c_grp_id) AS group_ids FROM c_grp_at GROUP BY c_id) puts ERROR: function string_agg(bigint, unknown, bigint) 不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
  • @cy221 STRING_AGG(c_grp_id::text, ',')
  • 问题出在组内。我删除了。
【解决方案2】:

从 Postgres 9.0 或更高版本开始,我相信你可以这样做:

SELECT c_id, STRING_AGG(c_grp_id, ',' ORDER BY c_grp_id) AS group_ids 
FROM c_grp_at 
GROUP BY c_id

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多