PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

como selecionar todos os registros contendo determinados valores de um campo json postgres contendo uma matriz


Use ANY para testar se o array jsonb contém qualquer dos valores corretos, que podem ser uma matriz ou uma subconsulta, usando seu exemplo sqlfiddle
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)

Você também pode passar um literal de array, neste caso seria necessário um array de valores JSONB, ou seja, o lado direito de @> pode ser substituído pelo literal ANY('{123,456}'::JSONB[])

Como alternativa, use o && para testar a sobreposição de matriz. Primeiro é necessário converter o array JSON/JSONB em um 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}'

Você também pode substituir o literal de matriz '{123, 456}' com uma subconsulta que retorna um array de inteiros, como (SELECT ARRAY_AGG(data_id) FROM tableB)

Outra opção seria usar ou na sua cláusula where
select *
from tableA 
where (data->'sequence') @> '[456]'
   or (data->'sequence') @> '[123]'