Проверьте, существует ли значение в массиве 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) 

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

  • Как объявить массив, когда я не знаю длину до времени выполнения?
  • Добавление элементов в массив Swift для нескольких streamов, вызывающих проблемы (поскольку массивы не являются streamобезопасными) - как мне обойти это?
  • Проверьте, присутствует ли элемент в массиве Bash
  • Указатель на 2d-массив
  • Bash: чтение строки в разделительной таблице в массив
  • получение размера массива из указателя c ++
  • Странный символ после массива символов
  • Array.Copy vs Buffer.BlockCopy
  • Как я могу сохранить результат команды find в виде массивов в Bash
  • Доступ к элементам элементов в JSONArray с помощью Java
  • Общие массивы в Java
  • Interesting Posts

    Entity Framework 4 Single () vs First () vs FirstOrDefault ()

    Почему при запуске в холодном режиме ноутбук работает медленно, пока я не перезагружу его после его прогрева?

    Как установить базовый url для restа в весенний ботинок?

    Как найти индекс строки в таблице с помощью jquery

    Amazon MWS – запрошенная подпись запроса не соответствует предоставленной подписке

    Windows 10 отключает сеть при блокировке ПК

    Как следует использовать равенства и hash-код при использовании JPA и Hibernate

    Должны ли службы всегда возвращать DTO или они могут также возвращать модели домена?

    Использование OpenSSL означает «неспособность записать« случайное состояние »?

    Избегание повторяющихся констант в CSS

    Sqlite над сетевым ресурсом

    Тип ответа в виде CSV

    Выключение дисплея в XP с помощью команды

    Не удается уловить событие нажатия кнопки кнопки панели инструментов

    Cookie заблокирован / не сохранен в IFRAME в Internet Explorer

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