较新的 postgres 版本中的 string_agg 函数

Posted

技术标签:

【中文标题】较新的 postgres 版本中的 string_agg 函数【英文标题】:string_agg function in newer postgres version 【发布时间】:2020-10-27 22:26:44 【问题描述】:

我目前正在研究几年前在 8.4 版本下开发的 postgres 代码,并正在迁移到 9.4 postgres 版本,我遇到了这行代码:

string_agg(''#attribute_''||attribute_id::varchar||'':''||attribute) as attr

在这种情况下:

_myquery='INSERT INTO mytable
        SELECT ID,string_agg(''#attribute_''||attribute_id::varchar||'':''||attribute,''|'') as attr
FROM my_attribute_table
GROUP BY ID;';

在迁移到 Postgres 9.4 的过程中,我得到了这个:

错误:函数 string_agg(text) 不存在 SQL 状态:42883 提示: 没有函数匹配给定的名称和参数类型。你可能需要 添加显式类型转换。

在新版本中处理 string_agg 的正确方法是什么?我知道我需要显式转换或添加分隔符,但听起来当前代码今天不会添加任何分隔符,是吗?

今天,我们在 attr 上获得的结果例如:

"#attribute_78:None#attribute_25:715#attribute_48:Consumer#attribute_538:1yr Ret Base#attribute_1178:1yr Ret Base"

【问题讨论】:

仅供参考,9.4 比 EOL 晚了约 6 个月。我会建议迁移到更新的受支持版本。 您的查询包含重复的单引号。这是否是另一个查询的一部分,也许是创建动态 SQL 的尝试?您尝试执行的实际查询是什么? 您真的不应该将 9.4 用作 2020 年的迁移目标。考虑直接升级到 12 我刚刚添加了执行此查询的上下文 【参考方案1】:

PostgreSQL 8.4 没有string_agg 函数,而当前版本中可用的string_agg 聚合函数接受两个参数,其中第二个是放在聚合值之间的分隔符。

所以这很可能是在 8.4 数据库中创建的自定义用户定义函数。

【讨论】:

【参考方案2】:

正如其他人指出的那样,Postgres 中没有string_agg(text)。您总是必须指定一个分隔符 - 但是您可以提供一个空字符串。为了解决投射的需要,我通常也更喜欢concat() 而不是||

string_agg(concat('#attribute_', attribute_id, ':', attribute), '') as attr

【讨论】:

【参考方案3】:

您需要展示您的预期输出,但与此同时:

select string_agg('#attribute_'||'test'||':'||'test2', ',') as attr5;

-----------------------
 #attribute_test:test2

【讨论】:

没有解释的反对票基本上是没有用的。我回答了这个问题:“在新版本中处理 string_agg 的正确方法是什么?”

以上是关于较新的 postgres 版本中的 string_agg 函数的主要内容,如果未能解决你的问题,请参考以下文章

在较旧的 Postgres (9.4) 上使用 Django 3+

较新的 CouchDB/Sofa 教程

如何切换节点版本以安装较新的版本(v14.15.4)

将较新的 Visual Studio 版本与较旧的 MFC 版本一起使用?

npm 是不是支持 semver 中较新的预发布版本?

强制 Git 在合并期间始终选择较新的版本?