Проверьте, существует ли значение в массиве Postgres

Мне нужен способ проверить, существует ли значение в заданном массиве. До сих пор я придумал что-то вроде этого

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int) 

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

Edit: Просто понял, что могу это сделать

 select '{1,2,3}'::int[] @> ARRAY[value_variable::int] 

Это намного лучше, и я считаю, что этого достаточно, но если у вас есть другие способы сделать это, пожалуйста, поделитесь.

Проще с ANY конструкцией :

 SELECT value_variable = ANY ('{1,2,3}'::int[]) 

Правильный операнд ANY (между скобками) может быть либо набором (результатом подзапроса, например), либо массивом . Существует несколько способов его использования:

  • SQLAlchemy: как фильтровать типы столбцов PgArray?

Важная разница. Операторы массива ( <@ , @> и др.) Ожидают типы массивов в качестве операндов и поддерживают индексы GIN или GiST в стандартном распределении PostgreSQL, в то время как конструкция ANY ожидает, что тип элемента будет левым операндом и не будет поддерживать эти индексы , Пример:

  • Индекс для поиска элемента в массиве JSON

Ничто из этого не работает для элементов NULL . Чтобы проверить NULL :

  • Проверьте, существует ли NULL в массиве Postgres

Следите за ловушкой, в которую я попал: проверяя, нет ли определенного значения в массиве, вы не должны делать:

 SELECT value_variable != ANY('{1,2,3}'::int[]) 

но использовать

 SELECT value_variable != ALL('{1,2,3}'::int[]) 

вместо.

но если у вас есть другие способы сделать это, пожалуйста, поделитесь.

Вы можете сравнить два массива. Если какое-либо из значений в левом массиве перекрывает значения в правильном массиве, оно возвращает true. Это хаки, но это работает.

 SELECT '{1}' && '{1,2,3}'::int[]; -- true SELECT '{1,4}' && '{1,2,3}'::int[]; -- true SELECT '{4}' && '{1,2,3}'::int[]; -- false 
  • В первом и втором запросе значение 1 находится в правильном массиве
  • Обратите внимание, что второй запрос является true , хотя значение 4 не содержится в правильном массиве
  • Для третьего запроса никакие значения в левом массиве (т.е. 4 ) не находятся в правильном массиве, поэтому он возвращает false

unnest может также использоваться. Он расширяет массив до набора строк, а затем просто проверяет, существует или нет значение, так же просто, как использование IN или NOT IN .

например

  1. id => uuid

  2. exception_list_ids => uuid []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)

При поиске существования элемента в массиве требуется правильное кастинг, чтобы передать парсер SQL postgres. Вот один пример запроса с использованием массива содержит оператор в условии соединения:

Для простоты я перечисляю только соответствующую часть:

 table1 other_name text[]; -- is an array of text 

Показана часть соединения SQL

 from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text] 

Также работает

 on t2.panel = ANY(t1.other_name) 

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

  • Как создать и использовать multidimensional array в Scala?
  • mongodb найти несколько элементов массива
  • Можно ли использовать константную переменную для объявления размера массива в C?
  • javascript - Разница между массивом и массивом
  • Почему я не могу создать массив с размером, определяемым глобальной переменной?
  • Какова стоимость вызова array.length
  • Класс Java Comparator для сортировки массивов
  • Изменение размера массива с помощью C
  • Многомерные массивы в Swift
  • Какому компилятору я должен доверять?
  • Получать случайные элементы из массива в swift
  • Interesting Posts

    получение исключения “IllegalStateException: не удается выполнить это действие после onSaveInstanceState”

    Как использовать условные обозначения при замене в Notepad ++ с помощью регулярных выражений

    Группирование столбцов данных по общим значениям

    Как использовать графические символы рисования линий с Midnight Commander на OS X под ssh?

    Как использовать addr2line в Android

    Правильно создайте RSACryptoServiceProvider из открытого ключа

    Предотrotation отклонения диалога при повороте экрана в Android

    Зачем мне вводить пароль для разблокировки по умолчанию?

    Как импортировать каталог электронной почты эволюции на новый компьютер?

    Несколько streamов пользовательского интерфейса – Winforms

    Существует ли NAS, который может действовать как «простой», «немой» USB-накопитель?

    Ошибка «Неизвестный class в файле Interface Builder» во время выполнения

    Оптимизация для быстрого умножения, но медленное добавление: FMA и doubleedouble

    Странная клавиатура

    Как сделать снимок экрана текущей веб-страницы с помощью javascript / jquery

    Давайте будем гением компьютера.