Нахождение пересечения между двумя целочисленными массивами в postgres

#sql #arrays #database #postgresql

Вопрос:

В документации postgres я обнаружил, что если у меня есть два внутренних массива, я могу использовать amp; оператор для получения общих элементов между двумя массивами(пересечение), но это утверждение:

 SELECT  ('{190,80}'::integer[]) amp; ('{190,80, 50}'::integer[])
 

вызывает эту ошибку:

 ERROR:  operator does not exist: integer[] amp; integer[]
LINE 1: SELECT  (('{190,80}'::integer[]) amp; ('{190,80, 50}'::integer[...
 

У меня есть postgresql версии 13

Мне интересно, почему это не работает, и как я могу исправить запрос или попробовать другую эффективную альтернативу.

Комментарии:

1. Мне любопытно, попытаетесь ли вы инициализировать свои массивы вне оператора, если это решит вашу проблему.

2. даже если я использую два столбца из своей таблицы, которые оба уже являются целочисленными типами [], это не работает, поэтому инициализация перед операцией не сработает, я просто отправил этот запрос, потому что всем легче воспроизвести проблему.

Ответ №1:

Документация, которую вы отправляете, предназначена для расширения. Чтобы использовать его, вы должны запустить CREATE EXTENSION intarray свою базу данных, чтобы эти команды работали. Это загрузит это расширение в базу данных, и с этого момента вы сможете использовать его во всех запросах к этой базе данных.

Вы можете прочитать больше о расширениях здесь и о том, как их загрузить, здесь

Комментарии:

1. спасибо, что это сработало для меня.

2. когда мне следует запускать CREATE EXTENSION intarray каждый раз, когда я подключаюсь к базе данных, или достаточно запустить ее один раз

3. Расширения создаются в базе данных, поэтому вам нужно будет запустить ее только после того, как я добавлю документацию по ответу

4. Спасибо, я действительно ценю это.

Ответ №2:

Как ответил @NuLo, сначала вы должны создать расширение в своей базе данных:

 create extension intarray;

select (array [190, 80] amp; array [190, 80, 50]);