#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]);