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