PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

come selezionare tutti i record contenenti determinati valori da un campo json postgres contenente un array

Usa ANY a per verificare se l'array jsonb contiene qualsiasi dei valori corretti, che possono essere un array o una sottoquery, usando il tuo esempio sqlfiddle

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

Puoi anche passare un array letterale, in questo caso richiederebbe un array di valori JSONB, ovvero il lato destro di @> potrebbe essere sostituito con il letterale ANY('{123,456}'::JSONB[])

In alternativa, usa il && per verificare la sovrapposizione di array. È prima necessario convertire l'array JSON/JSONB in ​​un array nativo

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}'

Puoi anche sostituire l'array letterale '{123, 456}' con una sottoquery che restituisce un array di numeri interi, come (SELECT ARRAY_AGG(data_id) FROM tableB)

Un'altra opzione sarebbe quella di utilizzare o nella tua clausola where

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