Агрегатнілише PostgreSQL

STRING_AGG

Склеює значення з багатьох рядків в один текст через роздільник.

Синтаксис

STRING_AGG(<вираз>, <роздільник>)
STRING_AGG(<вираз>, <роздільник> ORDER BY <критерій>)

Агрегатна функція: з групи рядків робить один рядок тексту. Порядок елементів сам по собі не гарантований, тож задавай його через ORDER BY просто в дужках. У стандарті SQL схожа функція називається LISTAGG.

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Усі імена одним рядком
SELECT STRING_AGG(name, ', ') AS names
FROM employees;
names
Emma, Liam, Olivia, Noah, Sophia
Окремий список для кожного відділу
SELECT department,
STRING_AGG(name, ', ' ORDER BY name) AS team
FROM employees
GROUP BY department
ORDER BY department;
departmentteam
backendEmma, Liam
designSophia
frontendNoah, Olivia

ORDER BY у дужках задає порядок імен усередині рядка, а той, що в кінці запиту, — порядок самих відділів.

Зверни увагу

Приймає лише текст: STRING_AGG(id, ', ') для числового id — помилка. Приведи тип: STRING_AGG(id::text, ', ').

NULL пропускаються мовчки, а якщо рядків нема зовсім — результат NULL, а не порожній рядок. Потрібен порожній текст — обгорни: COALESCE(STRING_AGG(…), '').

Для унікальних значень пиши STRING_AGG(DISTINCT department, ', '). Тоді ORDER BY усередині може сортувати лише за тим самим виразом.

Схожі функції

ARRAY_AGGCONCAT_WS