sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta de elementos de matriz dentro del tipo JSON

jsonb en PostgreSQL 9.4+

Tu puedes use la misma consulta que a continuación, solo con jsonb_array_elements() .

Pero mejor usa el jsonb operador "contiene" @> en combinación con un índice GIN coincidente en la expresión 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"}]';

Dado que la clave objects contiene una matriz JSON , necesitamos hacer coincidir la estructura en el término de búsqueda y envolver el elemento de la matriz también entre corchetes. Suelte los corchetes de la matriz cuando busque un registro simple.

Más explicación y opciones:

  • Índice para encontrar un elemento en una matriz JSON

json en PostgreSQL 9.3+

Desanime la matriz JSON con la función json_array_elements() en una unión lateral en el FROM cláusula y prueba para sus elementos:

SELECT data::text, obj
FROM   reports r, json_array_elements(r.data#>'{objects}') obj
WHERE  obj->>'src' = 'foo.png';

db<>violín aquí
Sqlfiddle antiguo

O, equivalente a solo un single nivel de anidamiento:

SELECT *
FROM   reports r, json_array_elements(r.data->'objects') obj
WHERE  obj->>'src' = 'foo.png';

->> , -> y #> los operadores se explican en el manual.

Ambas consultas usan un JOIN LATERAL implícito .

Muy relacionado:

  • Consulta del elemento de la matriz en la columna JSON