sql >> Databasteknik >  >> RDS >> PostgreSQL

Fråga efter arrayelement i JSON-typ

jsonb i Postgres 9.4+

Du kan använd samma fråga som nedan, bara med jsonb_array_elements() .

Men använd hellre jsonb "innehåller" operatorn @> i kombination med ett matchande GIN-index på uttrycket data->'objekt' :

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

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

Eftersom nyckeln objekt har en JSON array , måste vi matcha strukturen i söktermen och linda in arrayelementet i hakparenteser också. Släpp arrayparenteserna när du söker efter en vanlig post.

Mer förklaring och alternativ:

  • Index för att hitta ett element i en JSON-array

json i Postgres 9.3+

Avnesta JSON-arrayen med funktionen json_array_elements() i en lateral sammanfogning i FROM klausul och test för dess beståndsdelar:

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

db<>spela här
Gammal sqlfiddle

Eller motsvarande för bara en singel nivå av kapsling:

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

->> , -> och #> operatörer förklaras i manualen.

Båda frågorna använder en implicit JOIN LATERAL .

Närbesläktade:

  • Fråga efter element av array i JSON-kolumnen


  1. Övervakning av säkerhetskopior över instanser

  2. Optimering av MySQL-sökning med hjälp av like och jokertecken

  3. Vilken datatyp ska användas för hashat lösenordsfält och vilken längd?

  4. SQL-fråga för att hämta data för de senaste 3 månaderna