sql >> Databáze >  >> RDS >> PostgreSQL

Dotaz na prvky pole uvnitř typu JSON

jsonb v Postgres 9.4+

můžete použijte stejný dotaz jako níže, pouze s jsonb_array_elements() .

Ale raději použijte jsonb operátor "obsahuje" @> v kombinaci s odpovídajícím GIN indexem ve výrazu 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"}]';

Protože klíč objects obsahuje pole JSON , musíme porovnat strukturu ve hledaném výrazu a také zabalit prvek pole do hranatých závorek. Při prohledávání prostého záznamu odstraňte závorky pole.

Další vysvětlení a možnosti:

  • Index pro nalezení prvku v poli JSON

json v Postgres 9.3+

Zrušte vnoření pole JSON pomocí funkce json_array_elements() v bočním spojení v FROM klauzule a test na její prvky:

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

db<>zde hrajte
Starý sqlfiddle

Nebo ekvivalentní pro jednotlivé úroveň vnoření:

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

->> , -> a #> operátory jsou vysvětleny v příručce.

Oba dotazy používají implicitní JOIN LATERAL .

Úzce související:

  • Dotaz na prvek pole ve sloupci JSON


  1. SQL Server 2005 Pivot na neznámý počet sloupců

  2. Formátování příkazového řádku MySQL s UTF8

  3. Co je nového v PostgreSQL 12

  4. BIN() – Získá binární hodnotu čísla v MySQL