PostgreSQL | Как проверить наличие строки в массиве?

PostgreSQL | Как проверить наличие строки в массиве?

Предположим, что у нас есть массив в PostgreSQL:

SELECT ARRAY['один', 'два', 'три'];

Результат вызова:

Массив из трёх строк в PostgreSQL - 2022
Массив из трёх строк в PostgreSQL — 2022

Мы хотим проверить существование строки ‘четыре‘ в этом массиве. Как это сделать?

 

Решение задачи по проверки существования строки в массиве PostgreSQL через дополнительный массив из одного элемента строки и оператора @>

Для нашей задачи это самый простой и короткий способ решения.

Всё что нам нужно — это использование специального оператора @> (знак почты и правая угловая скобка)

Слева мы пишем массив в котором хотим искать. Слева — то ГДЕ ищем.

Справа мы пишем массив, элемент которого хотим поискать в левом массиве. Справа — то ЧТО ищем.

SELECT ARRAY['один', 'два', 'три'] @> ARRAY['один'];

Результат вызова:

Проверили существование строки в массиве строк в PostgreSQL - true
Проверили существование строки в массиве строк в PostgreSQL — true
SELECT ARRAY['один', 'два', 'три'] @> ARRAY['четыре'];

Результат вызова:

Проверили существование строки в массиве строк в PostgreSQL - false
Проверили существование строки в массиве строк в PostgreSQL — false

 

Можно поменять местами массивы и использовать противоположный оператор <@.

Суть остаётся той же. Только теперь слева ЧТО ищем, а справа ГДЕ ищем.

SELECT ARRAY['один'] <@ ARRAY['один', 'два', 'три'];  -- true

SELECT ARRAY['четыре'] <@ ARRAY['один', 'два', 'три']; -- false

 

Решение задачи по проверки существования строки в массиве PostgreSQL через дополнительный массив из одного элемента строки и оператора &&

Это решение немного похоже на предыдущее. Только на этот раз можно не заморачиваться с расположением массивов справа и слева от знака &&.

SELECT ARRAY['один', 'два', 'три'] && ARRAY['один'];
SELECT ARRAY['один', 'два', 'три'] && ARRAY['четыре'];

SELECT ARRAY['один'] && ARRAY['один', 'два', 'три'];
SELECT ARRAY['четыре'] && ARRAY['один', 'два', 'три'];

Результат от перестановки массивов местами не изменится.

Проверили существование строки в массиве строк в PostgreSQL через оператор двух амперсандов
Проверили существование строки в массиве строк в PostgreSQL через оператор двух амперсандов

 

Решение задачи по проверки существования строки в массиве PostgreSQL через переворот массива в таблицу

Одно из решений сводится к превращению массива строк в табличный столбец данных.

Мы как-бы переворачиваем массив из горизонтального положения в вертикальное.

Делается этот переворот при помощи функции unnest().

На первом этапе мы получаем таблицу:

SELECT unnest(ARRAY['один', 'два', 'три']);

Результат вызова:

Перевернули массив из трёх строк в таблицу в PostgreSQL - 2022
Перевернули массив из трёх строк в таблицу в PostgreSQL — 2022

С этого момента мы можем работать с таблицей стандартными командами SQL.

 

Мы можем использовать:

SELECT EXISTS (SELECT * FROM unnest(ARRAY['один', 'два', 'три']) WHERE unnest = 'один');

Результат вызова:

Строка 'один' существует в массиве PostgreSQL
Строка ‘один’ существует в массиве PostgreSQL
SELECT EXISTS (SELECT * FROM unnest(ARRAY['один', 'два', 'три']) WHERE unnest = 'четыре');

Результат вызова:

Строка 'четыре' отсутствует в массиве 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

Раздел «9.19. Функции и операторы для работы с массивами» — https://postgrespro.ru/docs/postgresql/14/functions-array