sql >> Base de Datos >  >> RDS >> PostgreSQL

cómo seleccionar todos los registros que contienen ciertos valores de un campo json de postgres que contiene una matriz

Usa ANY para probar si la matriz jsonb contiene any de los valores correctos, que pueden ser una matriz o una subconsulta, usando su ejemplo de sqlfiddle

SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)

También puede pasar un literal de matriz, en este caso requeriría una matriz de valores JSONB, es decir, el lado derecho de @> podría reemplazarse con el literal ANY('{123,456}'::JSONB[])

Alternativamente, use el && para probar la superposición de matrices. Primero es necesario convertir la matriz JSON/JSONB en una matriz nativa

SELECT tableA.*
FROM tableA 
JOIN LATERAL (
  SELECT ARRAY_AGG(v::INT) y 
  FROM JSONB_ARRAY_ELEMENTS_TEXT(data->'sequence') v
) x ON TRUE
WHERE x.y && '{123, 456}'

También puede reemplazar el literal de matriz '{123, 456}' con una subconsulta que devuelve una matriz de enteros, como (SELECT ARRAY_AGG(data_id) FROM tableB)

Otra opción sería usar o en su cláusula where

select *
from tableA 
where (data->'sequence') @> '[456]'
   or (data->'sequence') @> '[123]'