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

Forespørgsel efter array-elementer inde i JSON-typen

jsonb i Postgres 9.4+

Du kan brug den samme forespørgsel som nedenfor, bare med jsonb_array_elements() .

Men brug hellere jsonb "indeholder" operatoren @> i kombination med et matchende GIN-indeks på udtrykket data->'objekter' :

CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);

SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';

Siden nøglen objekter har et JSON array , er vi nødt til at matche strukturen i søgeordet og også pakke array-elementet ind i firkantede parenteser. Slip array-parenteserne, når du søger efter en almindelig post.

Flere forklaringer og muligheder:

  • Indeks til at finde et element i et JSON-array

json i Postgres 9.3+

Fjern JSON-arrayet med funktionen json_array_elements() i en lateral sammenføjning i FROM klausul og test for dens elementer:

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

db<>spil her
Gamle sqlfiddle

Eller tilsvarende for bare en enkelt Indlejringsniveau:

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

->> , -> og #> operatører er forklaret i manualen.

Begge forespørgsler bruger en implicit JOIN LATERAL .

Nært beslægtet:

  • Forespørgsel efter element af array i JSON-kolonnen


  1. Hvor mange rækker i en database er FOR MANGE?

  2. Hvad er SQL Server Blocking?

  3. TABLESAMPLE returnerer forkert antal rækker?

  4. Forespørg en parameter (postgresql.conf indstilling) som max_connections