PostgreSQL | Столбец в строку через запятую

PostgreSQL | Столбец в строку через запятую

Предположим у нас есть простая таблица с одним столбцом:

-- Создаём новую тестовую таблицу
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;

Данные в таблице состоят из одного столбца для простоты восприятия результатов вычислений. В качестве данных выступают имена людей на русском языке.

Некоторые имена повторяются по несколько раз. То есть разные записи таблицы могут содержать одинаковые имена.

SQL код простой таблицы с одним столбцом и повторяющимися данными - PostgreSQL
SQL код простой таблицы с одним столбцом и повторяющимися данными — PostgreSQL
Вид простой таблицы с одним столбцом в pgAdmin4 с повторением данных - PostgreSQL
Вид простой таблицы с одним столбцом в pgAdmin4 с повторением данных — PostgreSQL

 

Шаг 1 — Превращение столбца с ячейками данных в массив этих же данных

На первом шаге нам нужно перевернуть вертикальную последовательность данных в горизонтальную на 90 градусов. По сути, мы как бы наклоняем наш столбец. Мы используем функцию ARRAY(), которая встроена в PostgreSQL. Внутрь функции мы передаём наш подзапрос. Так как в основной таблице один столбец, то в подзапросе мы используем звёздочку. Если у вас несколько столбцов, то нужно использовать конкретное имя столбца.

-- Превращаем столбец в массив
SELECT ARRAY(SELECT * FROM test1.names);

После этого мы получаем одну ячейку таблицы с массивом. Результат преобразования столбца в массив:

Превратили столбец в массив в PostgreSQL
Превратили столбец в массив в PostgreSQL

 

Шаг 2 — Склеивание строковых элементов массива в одну строку через разделитель

Все элементы нашего массива имеют один тип данных — СТРОКА. Все элементы массива находятся на одном уровне вложенности. Во всех элементах массива отсутствует символ ЗАПЯТАЯ.

Это значит, что мы можем безболезненно использовать запятую для РАЗДЕЛИТЕЛЯ в общей строке.

Для приведения массива к строке нам поможет встроенная функция array_to_string(). Она может принимать 3 параметра, два из которых обязательны.

  • Первый параметр — массив
  • Второй параметр — разделитель
  • Третий параметр — символы замены «дырок» (null).

В нашем массиве нет null, поэтому мы будем использовать всего два параметра:

-- Превращаем массив в строку
SELECT array_to_string(ARRAY(SELECT * FROM test1.names), ',');

Скриншот:

Превратили массив из строк в одну большую строку с разделителем запятая в PostgreSQL
Превратили массив из строк в одну большую строку с разделителем запятая в PostgreSQL

Задача решена! Мы получили строку, в которой данные отделены друг от друга запятыми.

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Функции для массивов — https://postgrespro.ru/docs/postgresql/15/functions-array

Массивы — https://postgrespro.ru/docs/postgresql/15/arrays