Главная/Статьи/PostgreSQL: Работа с массивами — Как найти запись по значению массива хранящегося в колонке таблицы?
PostgreSQL

PostgreSQL: Работа с массивами — Как найти запись по значению массива хранящегося в колонке таблицы?

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

В нашем примере будет таблица с специалистами который говорят на разных языках, и один специалист может владеть сразу несколькими языками которые будут хранится в виде массива в колонке languages. Соответственно в результатах поиска мы сможем показать всех специалистов которые говорят например на немецком.

Создаем таблицу

Давайте для начала создадим таблицу с некоторым набором полей и нашим массивом:

CREATE TABLE professionals (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    languages TEXT[] NOT NULL -- это наш массив, указывается ключом []
);

Наполняем таблицу

INSERT INTO professionals (name, languages)
VALUES
('John', ARRAY['SE', 'GB', 'DE']),
('Emily', ARRAY['FR', 'GB']),
('David', ARRAY['US', 'DE']),
('Lisa', ARRAY['IT', 'FR', 'DE']);

Обратите внимание на формат вставки данных ARRAY['IT', 'FR', 'DE'] — это и есть наш массив по которому мы сможем искать по типу Where In Array.

Поиск по вхождению в массив

Теперь самое интересное. Допустим, вы хотите найти всех, кто говорит по немецки («DE»). Делаем запрос:

SELECT * FROM professionals WHERE 'DE' = ANY (languages);

Вот и вся сила магии PostgreSQL!

Однако помните, что с большой силой приходит и большая ответственность. ARRAY — это очень удобное хранилище данных, но при неправильном обращении может привести к нестабильной и медленной обработке запросов.

Если вы имеете дело с очень большим объемом данных или вам необходимо выполнять сложные запросы, подумайте об использовании отдельной таблицы и метода join для хранения отношений между сущностями и языками.