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 unaWHEREcláusula. Por razones conocidas solo por Crom, he pasado los últimos cuatro años pensando que no podría usar comparadores de matrices en lasWHEREcláusulas. Esos días se han ido ahora. (De niño me cayeron de cabeza, así que tal vez solo soy yo).booleanexpresión funciona en laWHEREclá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
ALLvsANYSELECT 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.
1está en la matriz correctatrue, aunque el valor4no esté contenido en la matriz correcta4) en la matriz derecha, por lo que devuelvefalsefuente
unnesttambié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 usarINoNOT 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