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