Предположим у нас есть простая таблица с одним столбцом:
-- Создаём новую тестовую таблицу CREATE TABLE test1.names ( name text ); -- Заполняем таблицу данными INSERT INTO test1.names VALUES ('Иван'); INSERT INTO test1.names VALUES ('Иван'); INSERT INTO test1.names VALUES ('Николай'); INSERT INTO test1.names VALUES ('Сергей'); INSERT INTO test1.names VALUES ('Сергей'); INSERT INTO test1.names VALUES ('Сергей'); INSERT INTO test1.names VALUES ('Сергей'); INSERT INTO test1.names VALUES ('Инна'); INSERT INTO test1.names VALUES ('Инна'); INSERT INTO test1.names VALUES ('Инна'); -- Делаем выборку данных по новой таблицу SELECT * FROM test1.names;
Данные в таблице состоят из одного столбца для простоты восприятия результатов вычислений. В качестве данных выступают имена людей на русском языке.
Некоторые имена повторяются по несколько раз. То есть разные записи таблицы могут содержать одинаковые имена.
Шаг 1 — Превращение столбца с ячейками данных в массив этих же данных
На первом шаге нам нужно перевернуть вертикальную последовательность данных в горизонтальную на 90 градусов. По сути, мы как бы наклоняем наш столбец. Мы используем функцию ARRAY(), которая встроена в PostgreSQL. Внутрь функции мы передаём наш подзапрос. Так как в основной таблице один столбец, то в подзапросе мы используем звёздочку. Если у вас несколько столбцов, то нужно использовать конкретное имя столбца.
-- Превращаем столбец в массив SELECT ARRAY(SELECT * FROM test1.names);
После этого мы получаем одну ячейку таблицы с массивом. Результат преобразования столбца в массив:
Шаг 2 — Склеивание строковых элементов массива в одну строку через разделитель
Все элементы нашего массива имеют один тип данных — СТРОКА. Все элементы массива находятся на одном уровне вложенности. Во всех элементах массива отсутствует символ ЗАПЯТАЯ.
Это значит, что мы можем безболезненно использовать запятую для РАЗДЕЛИТЕЛЯ в общей строке.
Для приведения массива к строке нам поможет встроенная функция array_to_string(). Она может принимать 3 параметра, два из которых обязательны.
- Первый параметр — массив
- Второй параметр — разделитель
- Третий параметр — символы замены «дырок» (null).
В нашем массиве нет null, поэтому мы будем использовать всего два параметра:
-- Превращаем массив в строку SELECT array_to_string(ARRAY(SELECT * FROM test1.names), ',');
Скриншот:
Задача решена! Мы получили строку, в которой данные отделены друг от друга запятыми.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Функции для массивов — https://postgrespro.ru/docs/postgresql/15/functions-array