Функция, эквивалентная STUFF в SQL (GROUP_CONCAT в MySSQL/LISTAGG в Oracle)

Кто-нибудь знает, есть ли в Firebird 2.5 функция, аналогичная функции STUFF в SQL?

У меня есть таблица, содержащая родительские пользовательские записи, и другая таблица, содержащая дочерние пользовательские записи, связанные с родителем. Я хотел бы иметь возможность вытащить строку с разделителями-запятыми ROLES, которые пользователь имеет, без необходимости использовать второй запрос, перебирать значения, возвращаемые для данного идентификатора, и создавать строку самостоятельно.

Я искал любые другие связанные вопросы, но не нашел ни одного. Вопрос в этой ссылке строковый эквивалент суммы для конкатенации в основном то, что я хочу сделать тоже, но с базой данных Firebird 2.5.


person Phil    schedule 29.10.2014    source источник


Ответы (1)


Похоже, вам повезло — в Firebird 2.1 появились LIST() агрегатная функция, которая работает как GROUP_CONCAT в MySQL и позволяет выполнять такой запрос:

SELECT p.Name, LIST(c.Name, ', ')
FROM parent p INNER JOIN child c on c.parentid = p.parentid
GROUP by p.Name;

Редактировать, переупорядочивать

Вы можете влиять на порядок, предварительно упорядочив данные в производной таблице до применения функции агрегации LIST, например так:

SELECT x.ParentName, LIST(x.ChildName, ', ')
FROM 
(
  SELECT p.Name as ParentName, c.Name as ChildName
  FROM parent p INNER JOIN child c on c.parentid = p.parentid
  ORDER BY c.Name DESC
) x
GROUP by x.ParentName;
person StuartLC    schedule 29.10.2014
comment
Что насчет заказа? Скажем, мне нужны имена родителей и детей в алфавитном порядке, если я добавлю ORDER BY p.Name, c.Name) я получаю эту ошибку: Недопустимое выражение в предложении ORDER BY (не содержится ни в агрегатной функции, ни в GROUP BY) из-за наличия c.Name в предложении order by. Есть ли способ решить эту проблему? - person Bozzy; 05.02.2016
comment
@Bozzy, вы можете повлиять на порядок, выполнив упорядоченную предварительную проекцию в производной таблице. Я обновил ответ. - person StuartLC; 09.02.2016