PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Query per gli elementi dell'array all'interno del tipo JSON

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