PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

comment sélectionner tous les enregistrements contenant certaines valeurs à partir d'un champ postgres json contenant un tableau

Utilisez ANY to pour tester si le tableau jsonb contient any des bonnes valeurs, qui peuvent être un tableau ou une sous-requête, en utilisant votre exemple sqlfiddle

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

Vous pouvez également passer un tableau littéral, dans ce cas, il faudrait un tableau de valeurs JSONB, c'est-à-dire le côté droit de @> pourrait être remplacé par le littéral ANY('{123,456}'::JSONB[])

Sinon, utilisez le && pour tester le chevauchement des tableaux. Il faut d'abord convertir le tableau JSON/JSONB en tableau natif

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

Vous pouvez également remplacer le littéral de tableau '{123, 456}' avec une sous-requête qui renvoie un tableau d'entiers, comme (SELECT ARRAY_AGG(data_id) FROM tableB)

Une autre option serait d'utiliser ou dans votre clause where

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