PostgreSQL | Как получить ID записей в виде массива, а не таблицы?

PostgreSQL | Как получить ID записей в виде массива, а не таблицы?

В чём проблема получения таблицы с данными по запросу SELECT?

У нас есть таблица с доменными именами.

Таблица с доменными именами из которой нужно отобрать по части строки имени
Таблица с доменными именами из которой нужно отобрать по части строки имени

Мы знаем как отобрать нужные нам ЗАПИСИ из этой таблицы в виде ТАБЛИЦЫ.

 

Пример SQL-запроса в PostgreSQL:

SELECT * FROM a.t_dname WHERE dname LIKE '%.tumblr' LIMIT 5;

Результат работы запроса:

Отобрали 5 записей из таблицы по части строки в PostgreSQL
Отобрали 5 записей из таблицы по части строки в PostgreSQL

Мы также знаем как нам отобрать только ЗАПИСИ столбца идентификаторов.

Пример SQL-запроса в PostgreSQL:

SELECT id FROM a.t_dname WHERE dname LIKE '%.tumblr' LIMIT 5;

Результат работы запроса:

Получили значения из 5 идентификаторов таблицы в виде таблицы в PostgreSQL
Получили значения из 5 идентификаторов таблицы в виде таблицы в PostgreSQL

Но как нам получить все эти идентификаторы в виде МАССИВА, а не ТАБЛИЦЫ?

 

Решение

В PostgreSQL есть возможность создать массив из таблицы. То есть, возможно создать массив из результатов подзапроса SELECT.

Для этого нужно написать ключевое слово ARRAY и после него в круглых скобках ( ) записать сам подзапрос SELECT.

Пример SQL-запроса создания массива из таблицы в PostgreSQL:

SELECT ARRAY(SELECT id FROM a.t_dname WHERE dname LIKE '%.tumblr' LIMIT 5);

Результат работы запроса:

Получили значения из 5 идентификаторов таблицы в виде массива в PostgreSQL
Получили значения из 5 идентификаторов таблицы в виде массива в PostgreSQL

Обратите внимание, что МАССИВ в PostgreSQL визуально отображается в фигурных скобках, хотя по факту должны быть квадратные скобки, как в любом нормальном языке программирования.

Мы получили массив с типом данных bigint и теперь можем использовать его для дальнейшей обработки в функции.

 

В чём проблема?

Единственный недостаток этого способа заключается в том, что мы при помощи ПОДЗАПРОСА можем получить МАССИВ только на основании ОДНОГО столбца ТАБЛИЦЫ.

Это значит, что массив будет одноуровневый — все элементы одного типа будут находиться на одном уровне вложенности массива. Из подзапроса нельзя сделать глубокий массив, который например возвращал бы нам пары значений (или тройки, ну и так далее)

ОШИБКА - подзапрос должен вернуть только один столбец - PostgreSQL
ОШИБКА — подзапрос должен вернуть только один столбец — PostgreSQL

 

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

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

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

Раздел «4.2.12. Конструкторы массивов» — https://postgrespro.ru/docs/postgresql/14/sql-expressions#SQL-SYNTAX-ARRAY-CONSTRUCTORS

Оператор LIKEhttps://postgrespro.ru/docs/postgresql/14/functions-matching#FUNCTIONS-LIKE