Используя Postgres 9.0, мне нужен способ проверить, существует ли значение в данном массиве. Пока что я придумал что-то вроде этого:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Но я продолжаю думать, что должен быть способ попроще, я просто не вижу этого. Кажется, лучше:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Я думаю, этого будет достаточно. Но если у вас есть другие способы сделать это, поделитесь, пожалуйста!
источник
ANY/ALL (array) requires array on right side
, добавление::int[]
сделало шарм.'something' = ANY(some_array)
это также может быть использовано вWHERE
предложении. По причинам, известным только Крому, последние четыре года я думал, что не могу использовать компараторы массивов вWHERE
предложениях. Те дни прошли. (В детстве меня уронили на голову, может, это только я).boolean
выражение работает вWHERE
предложении - Кром желает.Остерегайтесь ловушки, в которую я попал: при проверке отсутствия определенного значения в массиве делать не следует:
SELECT value_variable != ANY('{1,2,3}'::int[])
но используйте
SELECT value_variable != ALL('{1,2,3}'::int[])
вместо.
источник
ALL
vsANY
SELECT NOT value_variable = ANY('{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
.например
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
источник
При поиске наличия элемента в массиве требуется правильное приведение для передачи синтаксическому анализатору SQL postgres. Вот один пример запроса с использованием оператора array contains в предложении соединения:
Для простоты я перечисляю только соответствующую часть:
table1 other_name text[]; -- is an array of text
Показанная соединительная часть SQL
Следующее также работает
Я просто предполагаю, что требуется дополнительное приведение, потому что синтаксическому анализу не нужно извлекать определение таблицы, чтобы определить точный тип столбца. Другие, пожалуйста, прокомментируйте это.
источник
Привет, у меня отлично работает, может быть, кому-то пригодится
select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);
источник
«Любой» работает хорошо. Просто убедитесь, что ключевое слово any находится справа от знака равенства, т.е. стоит после знака равенства.
Приведенный ниже оператор вызовет ошибку: ОШИБКА: синтаксическая ошибка рядом с "любым"
select 1 where any('{hello}'::text[]) = 'hello';
В то время как ниже пример работает нормально
select 1 where 'hello' = any('{hello}'::text[]);
источник