Compruebe si el valor existe en la matriz de Postgres
Al usar Postgres 9.0, necesito una forma de probar si existe un valor en una matriz determinada. 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 sencilla de hacerlo, pero no puedo verla. Esto parece mejor:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Creo que será suficiente. Pero si tienes otras formas de hacerlo, ¡compártela!
Más simple con la ANY
construcción:
SELECT value_variable = ANY ('{1,2,3}'::int[])
El operando derecho de ANY
(entre paréntesis) puede ser un conjunto (resultado de una subconsulta, por ejemplo) o una matriz . Hay varias formas de utilizarlo:
- SQLAlchemy: ¿cómo filtrar por tipos de columnas PgArray?
- IN vs CUALQUIER operador en PostgreSQL
Diferencia importante : los operadores de matriz ( <@
,, et al.)@>
&&
esperan tipos de matriz como operandos y admiten índices GIN o GiST en la distribución estándar de PostgreSQL, mientras que la construcciónANY
espera un tipo de elemento como operando izquierdo y puede ser compatible con un árbol B simple. index (con la expresión indexada a la izquierda del operador, no al revés como parece en su ejemplo). Ejemplo:
- Índice para encontrar un elemento en una matriz JSON
Nada de esto funciona para NULL
los elementos. Para probar NULL
:
- Compruebe si existe NULL en la matriz de Postgres
Cuidado con la trampa en la que me metí: al verificar si cierto valor no está presente en una matriz, no debes hacer:
SELECT value_variable != ANY('{1,2,3}'::int[])
pero usa
SELECT value_variable != ALL('{1,2,3}'::int[])
en cambio.