较新的 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+