PostgreSQL String Agg - объединение строк в PostgreSQL
PostgreSQL обладает мощными возможностями для агрегации строк (string_agg) в запросах, что позволяет объединять значения строковых полей в одну строку в результате выполнения запроса. Это очень полезная функция, которая может быть использована во многих сценариях, от группировки данных до создания отчетов.
Функция string_agg принимает два аргумента: выражение и разделитель. Выражение - это поле, значение которого нужно объединить, а разделитель определяет символ или символы, которые будут использоваться для разделения объединенных значений.
Давайте рассмотрим пример использования функции string_agg в PostgreSQL. Предположим, у нас есть таблица "orders" с полями "order_id", "customer_name" и "product_name". Наша задача - объединить все имена продуктов для каждого заказа, разделив их запятой.
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_name VARCHAR(50),
product_name VARCHAR(50)
);
INSERT INTO orders (customer_name, product_name)
VALUES
('Иванов', 'Яблоки'),
('Петров', 'Груши'),
('Сидоров', 'Апельсины'),
('Иванов', 'Мандарины');
Теперь давайте напишем запрос с использованием функции string_agg:
SELECT
orders.order_id,
orders.customer_name,
string_agg(orders.product_name, ',')
FROM
orders
GROUP BY
orders.order_id,
orders.customer_name;
В результате выполнения этого запроса мы получим следующий результат:
order_id | customer_name | string_agg
----------+---------------+-----------------
1 | Иванов | Яблоки,Мандарины
2 | Петров | Груши
3 | Сидоров | Апельсины
Как видим, имена продуктов для каждого заказа объединены в одну строку, разделенные запятыми.
Также, функция string_agg может использоваться с условными выражениями и фильтрами. Например, можно использовать функцию CASE с функцией string_agg для условного объединения строк. Рассмотрим следующий пример:
SELECT
orders.order_id,
orders.customer_name,
string_agg(
CASE
WHEN orders.product_name = 'Яблоки' THEN 'Красные яблоки'
WHEN orders.product_name = 'Мандарины' THEN 'Мандарины с малыми косточками'
ELSE orders.product_name
END, ','
)
FROM
orders
GROUP BY
orders.order_id,
orders.customer_name;
В этом примере мы заменям значения "Яблоки" на "Красные яблоки" и "Мандарины" на "Мандарины с малыми косточками", в остальных случаях оставляя значение без изменений. Результат будет выглядеть следующим образом:
order_id | customer_name | string_agg
----------+---------------+------------------------------
1 | Иванов | Красные яблоки,Мандарины с малыми косточками
2 | Петров | Груши
3 | Сидоров | Апельсины
Таким образом, функция string_agg очень полезна при работе с агрегацией строк в PostgreSQL. Вы можете использовать ее для объединения значений строковых полей в запросах и добавления нужного разделителя. Это значительно упрощает фильтрацию, группировку и отображение данных, что делает ваш код более лаконичным и читабельным.