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

Consulta de elementos de matriz dentro do tipo JSON

jsonb no Postgres 9.4+


Você pode use a mesma consulta abaixo, apenas com jsonb_array_elements() .

Mas use o jsonb operador "contém" @> em combinação com um índice GIN correspondente na expressão data->'objects' :
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);

SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';

Como a chave objects contém uma matriz JSON , precisamos corresponder à estrutura no termo de pesquisa e colocar o elemento da matriz entre colchetes também. Solte os colchetes da matriz ao pesquisar um registro simples.

Mais explicações e opções:
  • Índice para encontrar um elemento em uma matriz JSON

json no Postgres 9.3+


Desaninhar o array JSON com a função json_array_elements() em uma junção lateral no FROM cláusula e teste para seus elementos:
SELECT data::text, obj
FROM   reports r, json_array_elements(r.data#>'{objects}') obj
WHERE  obj->>'src' = 'foo.png';

db<>mexa aqui
antigo sqlfiddle

Ou equivalente para apenas um único nível de aninhamento:
SELECT *
FROM   reports r, json_array_elements(r.data->'objects') obj
WHERE  obj->>'src' = 'foo.png';

->> , -> e #> operadores são explicados no manual.

Ambas as consultas usam um JOIN LATERAL implícito .

Intimamente relacionado:
  • Consulta do elemento da matriz na coluna JSON