sql >> Database >  >> RDS >> PostgreSQL

Query voor array-elementen binnen JSON-type

jsonb in Postgres 9.4+

Je kunt gebruik dezelfde query als hieronder, alleen met jsonb_array_elements() .

Maar gebruik liever de jsonb "bevat" operator @> in combinatie met een bijpassende GIN-index op de uitdrukking 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"}]';

Aangezien de sleutel objects bevat een JSON array , moeten we overeenkomen met de structuur in de zoekterm en het array-element ook tussen vierkante haken plaatsen. Laat de array-haakjes vallen bij het zoeken naar een gewoon record.

Meer uitleg en opties:

  • Index voor het vinden van een element in een JSON-array

json in Postgres 9.3+

Unnest de JSON-array met de functie json_array_elements() in een laterale verbinding in de FROM clausule en test voor zijn elementen:

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

db<>viool hier
Oude sqlfiddle

Of, equivalent voor slechts een enkele niveau van nesten:

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

->> , -> en #> operators worden uitgelegd in de handleiding.

Beide zoekopdrachten gebruiken een impliciete JOIN LATERAL .

Nauw verwant:

  • Query voor element van array in JSON-kolom


  1. SQL DELETE-syntaxis - weergegeven door DBMS

  2. Sorteer op kolom ASC, maar eerst NULL-waarden?

  3. Toegang tot MySQL-poorten beperken?

  4. OLTP-prestaties sinds PostgreSQL 8.3