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