0

我目前正在研究几年前在 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"
4

3 回答 3

1

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

string_agg(concat('#attribute_', attribute_id, ':', attribute), '') as attr
于 2020-07-08T10:44:56.497 回答
1

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

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

于 2020-07-08T06:11:26.477 回答
-1

您需要显示您的预期输出是什么,但与此同时:

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

-----------------------
 #attribute_test:test2
于 2020-07-07T16:35:50.203 回答