【问题标题】:string_agg(character_varying) doesnt existstring_agg(字符变化)不存在
【发布时间】:2021-05-09 22:05:53
【问题描述】:

我正在从 MSSQL 迁移到 PostgreSQL

MSSQL 查询:

SELECT * FROM dbo.Mtr_userdetails AS table1 JOIN( SELECT urmo.urm_userid STUFF((SELECT ',' + urm.urm_role_name FROM dbo.STL_CS_Mtr_userrolemapping urm WHERE urm.urm_userid = 'test2' AND urm.urm_status = 'A' AND urm.urm_appid = 'BCA' FOR XML PATH('')),1,1,'') [user_roles],urmo.urm_appid FROM dbo.Mtr_userrolemapping urmo WHERE urmo.urm_appid = 'BCA' AND urmo.urm_userid = 'test2' GROUP BY urmo.urm_userid,urmo.urm_appid) AS table2 ON table1.ud_userid = table2.urm_userid WHERE (table1.ud_userid = 'test2')

我正在尝试将上述 ms sql 查询转换为 postgresql 语法。

PostgreSQL 查询:

SELECT *
FROM STL_Mtr_userdetails AS table1
  JOIN (
    SELECT urmo.urm_userid,
           string_agg((SELECT ',' || urm.urm_role_name 
                       FROM STL_CS_Mtr_userrolemapping urm
                       WHERE urm.urm_userid = 'test2' 
                         AND urm.urm_status = 'A' 
                         AND urm.urm_appid = 'BCA')::varchar, 1::varchar, 1::varchar, ''::varchar) user_roles,
           urmo.urm_appid
    FROM STL_CS_Mtr_userrolemapping urmo
    WHERE urmo.urm_appid = 'BCA'
      AND urmo.urm_userid = 'test2'
    GROUP BY urmo.urm_userid,
             urmo.urm_appid
  ) AS table2 ON table1.ud_userid = table2.urm_userid
WHERE (table1.ud_userid = 'test2')

执行我的 postgresql 查询时遇到以下错误

string_agg(字符变化,字符变化,字符变化,字符变化)不存在。没有提示匹配给定的名称和参数类型。您可能需要添加显式类型转换。

【问题讨论】:

  • 真的建议在编写时使用空格和换行符(我的意思不仅仅是写代码,我是说一般情况)。该代码对于“单行”来说太宽了。
  • 嗯,as documented in the manual string_agg() 只需要两个参数,而不是 4
  • 当然,会遵循的

标签: sql postgresql string-aggregation


【解决方案1】:

不需要复杂的嵌套标量子选择。直接聚合即可:

SELECT *
FROM STL_Mtr_userdetails AS table1
  JOIN (
    SELECT urmo.urm_userid,
           string_agg(urm.urm_role_name, ',') as user_roles
    FROM STL_CS_Mtr_userrolemapping urmo
    WHERE urmo.urm_appid = 'BCA'
    GROUP BY urmo.urm_userid
  ) AS table2 ON table1.ud_userid = table2.urm_userid
WHERE table1.ud_userid = 'test2'

错误消息源于您尝试使用四个 (varchar) 参数调用 string_agg() 函数。但是string_agg()defined 只接收两个参数(要聚合的值和分隔符)。

【讨论】:

  • 感谢您的回答。我执行了上面的查询,它说缺少表 'urm' 的 FROM 子句条目
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2021-11-15
  • 2018-12-16
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多