string_agg(character_varying) не существует

Я делаю миграцию с 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.

Запрос Postgres Pro:

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 (изменение символов, изменение символов, изменение символов, изменение символов) не существует. Никакая подсказка не соответствует заданному имени и типам аргументов. вам может потребоваться добавить явное приведение типов.


person Bhoomika N Kumar    schedule 05.02.2021    source источник
comment
Я действительно рекомендую использовать пробелы и разрывы строк при написании (я имею в виду не только написание кода, я имею в виду вообще). Этот код намного слишком широк для одной строчки.   -  person Larnu    schedule 05.02.2021
comment
Итак, как описано в руководстве string_agg() принимает только два параметра. , а не 4   -  person a_horse_with_no_name    schedule 05.02.2021
comment
Конечно, последует за этим   -  person Bhoomika N Kumar    schedule 09.02.2021


Ответы (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'

Сообщение об ошибке связано с тем, что вы пытаетесь вызвать функцию string_agg() с четырьмя параметрами (varchar). Но string_agg() определен для получения только двух параметров (значения для агрегирования и разделитель).

person a_horse_with_no_name    schedule 05.02.2021
comment
Спасибо за ваш ответ. Я выполнил вышеуказанный запрос, и он говорит, что отсутствует запись FROM-clause для таблицы 'urm' - person Bhoomika N Kumar; 08.02.2021