【问题标题】:string_agg function in newer postgres version较新的 postgres 版本中的 string_agg 函数
【发布时间】: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
  • 我刚刚添加了执行此查询的上下文

标签: postgresql casting string-agg


【解决方案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 的正确方法是什么?”
      猜你喜欢
      • 2016-08-11
      • 2021-12-05
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2011-04-01
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多