Функция STRING_AGG() в PostgreSQL: склейка значений группы
STRING_AGG(выражение, разделитель) — агрегатная функция PostgreSQL, которая объединяет значения из всех строк группы в одну строку через заданный разделитель. Аналитик применяет её, чтобы собрать список товаров в заказе, теги в одну ячейку или список email по компании. В MySQL/SQLite аналог — GROUP_CONCAT, в Oracle — LISTAGG.
Синтаксис
STRING_AGG(выражение, разделитель [ORDER BY …])
Примеры использования
Пример 1: Список товаров в каждом заказе
SELECT order_id,
STRING_AGG(product_name, ', ' ORDER BY product_name) AS products
FROM order_items
GROUP BY order_id;
Порядок склейки без ORDER BY внутри STRING_AGG недетерминирован — если нужен стабильный вывод, добавляй ORDER BY. NULL-значения функция пропускает. Для уникальных значений используй DISTINCT внутри STRING_AGG, но помни, что DISTINCT и ORDER BY по разным выражениям одновременно PostgreSQL не разрешит.
Где спрашивают на собеседовании
STRING_AGG спрашивают в задачах «собери список в одну строку» и при денормализации для витрин/отчётов. На собеседовании назови кросс-СУБД аналоги (GROUP_CONCAT, LISTAGG) — это показывает широту.
FAQ: частые вопросы про STRING_AGG
Чем STRING_AGG отличается от GROUP_CONCAT?
Это одно и то же по смыслу, но STRING_AGG — синтаксис PostgreSQL (значение, разделитель), а GROUP_CONCAT — MySQL/SQLite (разделитель задаётся через SEPARATOR). В Oracle аналог называется LISTAGG.
Как отсортировать значения внутри STRING_AGG?
Добавь ORDER BY прямо в вызов: STRING_AGG(name, ', ' ORDER BY name) — тогда склейка будет в заданном порядке, а не случайной.
Как склеить только уникальные значения?
Используй STRING_AGG(DISTINCT выражение, разделитель). Дубликаты будут убраны до склейки.