Usando Postgres 9.0, necesito una forma de probar si existe un valor en una matriz dada. Hasta ahora se me ocurrió algo como esto:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Pero sigo pensando que debería haber una forma más simple de hacerlo, simplemente no puedo verlo. Esto parece mejor:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Creo que será suficiente. Pero si tiene otras formas de hacerlo, ¡comparta!
fuente
ANY/ALL (array) requires array on right side
, el complemento de::int[]
hizo el encanto.'something' = ANY(some_array)
también se puede usar en unaWHERE
cláusula. Por razones conocidas solo por Crom, he pasado los últimos cuatro años pensando que no podría usar comparadores de matrices en lasWHERE
cláusulas. Esos días se han ido ahora. (De niño me cayeron de cabeza, así que tal vez solo soy yo).boolean
expresión funciona en laWHERE
cláusula - Crom dispuesto.Tenga cuidado con la trampa en la que me metí: al verificar si cierto valor no está presente en una matriz, no debe hacer lo siguiente:
pero usa
en lugar.
fuente
ALL
vsANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
podría ser más legiblePuedes comparar dos matrices. Si alguno de los valores en la matriz izquierda se superpone a los valores en la matriz derecha, entonces devuelve verdadero. Es un poco hack, pero funciona.
1
está en la matriz correctatrue
, aunque el valor4
no esté contenido en la matriz correcta4
) en la matriz derecha, por lo que devuelvefalse
fuente
unnest
también se puede usar Expande la matriz a un conjunto de filas y luego simplemente verificar si un valor existe o no es tan simple como usarIN
oNOT IN
.p.ej
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
fuente
Cuando se busca la existencia de un elemento en una matriz, se requiere una conversión adecuada para pasar el analizador SQL de postgres. Aquí hay una consulta de ejemplo que usa el operador contiene matriz en la cláusula join:
Para simplificar, solo enumero la parte relevante:
La parte de unión de SQL que se muestra
Lo siguiente también funciona
Supongo que se requiere una conversión adicional porque el análisis no tiene que buscar la definición de la tabla para calcular el tipo exacto de la columna. Otros por favor comenten sobre esto.
fuente
Hola, eso funciona bien para mí, quizás sea útil para alguien
seleccione * desde su_tabla donde array_column :: text ilike ANY (ARRAY ['% text_to_search%' :: text]);
fuente