Compruebe si el valor existe en la matriz de Postgres

Resuelto Mike Starov asked hace 12 años • 8 respuestas

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!

Mike Starov avatar Jun 28 '12 00:06 Mike Starov
Aceptado

Más simple con la ANYconstrucció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 NULLlos elementos. Para probar NULL:

  • Compruebe si existe NULL en la matriz de Postgres
Erwin Brandstetter avatar Jun 27 '2012 17:06 Erwin Brandstetter

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.

murison avatar Apr 12 '2013 10:04 murison