jsonb in Postgres 9.4+
puoi usa la stessa query di seguito, solo con jsonb_array_elements() .
Ma usa piuttosto jsonb "contiene" l'operatore @> in combinazione con un indice GIN corrispondente sull'espressione 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"}]';
Poiché la chiave objects contiene un array JSON , è necessario abbinare la struttura nel termine di ricerca e racchiudere anche l'elemento dell'array tra parentesi quadre. Elimina le parentesi dell'array durante la ricerca di un record semplice.
Ulteriori spiegazioni e opzioni:
- Indice per trovare un elemento in un array JSON
json in Postgres 9.3+
Annulla l'annidamento dell'array JSON con la funzione json_array_elements() in un join laterale nel FROM clausola e test per i suoi elementi:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>gioca qui
Sqlfiddle vecchio
O, equivalente per un solo single livello di nidificazione:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->> , -> e #> gli operatori sono spiegati nel manuale.
Entrambe le query utilizzano un implicito JOIN LATERAL .
Strettamente correlato:
- Query per l'elemento dell'array nella colonna JSON