saber query postgres existe example elemento crear comparar array arrays postgresql postgresql-9.0

arrays - existe - query array postgresql



Compruebe si el valor existe en la matriz de Postgres (5)

pero si tienes otras formas de hacerlo, comparte.

Puedes comparar dos matrices. Si alguno de los valores en el conjunto izquierdo se superpone con los valores en el conjunto de la derecha, entonces devuelve verdadero. Es un poco hackish, pero funciona.

SELECT ''{1}'' && ''{1,2,3}''::int[]; -- true SELECT ''{1,4}'' && ''{1,2,3}''::int[]; -- true SELECT ''{4}'' && ''{1,2,3}''::int[]; -- false

  • En la primera y segunda consulta, el valor 1 está en la matriz correcta
  • Tenga en cuenta que la segunda consulta es true , aunque el valor 4 no se encuentre en la matriz correcta
  • Para la tercera consulta, no hay valores en la matriz izquierda (es decir, 4 ) en la matriz correcta, por lo que devuelve false

Necesito una forma de comprobar 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 simple de hacerlo, simplemente no puedo verlo.

Editar: me di cuenta de que podía hacer esto

select ''{1,2,3}''::int[] @> ARRAY[value_variable::int]

Esto es mucho mejor y creo que será suficiente, pero si tiene otras formas de hacerlo, comparta.


Cuando se busca la existencia de un elemento en una matriz, se requiere la conversión adecuada para pasar el analizador SQL de postgres. Aquí hay una consulta de ejemplo que utiliza el operador array contains en la cláusula join:

Para simplificar, solo enumero la parte relevante:

table1 other_name text[]; -- is an array of text

La parte de unión de SQL se muestra

from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]

Lo siguiente también funciona

on t2.panel = ANY(t1.other_name)

Solo estoy adivinando que se requiere el lanzamiento extra 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 comentan esto.


Cuidado con la trampa en la que me metí: cuando compruebes 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 lugar.


Más simple con la construcción ANY :

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 usarlo:

Diferencia importante : los operadores de matriz ( <@ , @> y otros) esperan tipos de matriz como operandos y admiten índices GIN o GiST en la distribución estándar de PostgreSQL, mientras que la construcción ANY espera un tipo de elemento como operando izquierdo y no admite estos índices . Ejemplo:

Nada de esto funciona para elementos NULL . Para probar NULL :


unnest se puede usar. Extiende la matriz a un conjunto de filas y luego simplemente verifica que un valor existe o no es tan simple como usar IN o NOT IN .

p.ej

  1. id => uuid

  2. exception_list_ids => uuid []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)