Introdus în PostgreSQL 12 pe baza standardului internațional SQL/JSON, limbajul JSON Path oferă o modalitate declarativă, extrem de expresivă și performantă de a naviga, filtra și transforma structuri JSONB imbricate. Înainte de JSON Path, manipularea colecțiilor JSON complexe necesita combinări greoaie de jsonb_array_elements, CROSS JOIN LATERAL și filtre multiple.
-- Tabel de utilizatori cu comenzi în format JSONB
CREATE TABLE clienti (
id SERIAL PRIMARY KEY,
profil JSONB
);
INSERT INTO clienti (profil) VALUES (
'{
"nume": "Mihai Popa",
"adrese": [{"oras": "București", "tip": "livrare"}, {"oras": "Brașov", "tip": "facturare"}],
"comenzi": [
{"id": 101, "total": 250, "finalizata": true},
{"id": 102, "total": 1200, "finalizata": true},
{"id": 103, "total": 80, "finalizata": false}
]
}'
);
-- 1. Extragem doar ID-urile comenzilor finalizate cu total > 500 folosind jsonb_path_query:
SELECT jsonb_path_query(profil, '$.comenzi[*] ? (@.finalizata == true && @.total > 500).id') AS comanda_premium
FROM clienti;
-- Rezultat: 102
Funcțiile Esențiale din Familia SQL/JSON Path
PostgreSQL oferă patru funcții complementare pentru lucru cu expresii de cale JSON:
| Funcție | Tip Returnat | Descriere & Caz de Utilizare |
|---|---|---|
jsonb_path_query(target, path) |
SETOF jsonb |
Returnează toate elementele JSON potrivite de expresia de filtrare, sub formă de rânduri individuale. |
jsonb_path_exists(target, path) |
BOOLEAN |
Verifică dacă există cel puțin o potrivire pentru calea specificată. Ideal pentru clauza WHERE! |
jsonb_path_match(target, path) |
BOOLEAN |
Evaluează un predicat boolean SQL/JSON pe întregul document țintă. |
jsonb_path_query_array(target, path) |
jsonb (Array) |
Agregă toate rezultatele potrivite într-un singur array JSONB (în loc de rânduri separate). |
-- Selectăm clienții care au cel puțin o adresă de livrare în Cluj:
SELECT id, profil->>'nume' AS nume
FROM clienti
WHERE jsonb_path_exists(profil, '$.adrese[*] ? (@.oras == "Cluj" && @.tip == "livrare")');
Optimizarea cu Indecși GIN (jsonb_path_ops)
Pentru a căuta instantaneu în tabele cu milioane de documente JSONB, creați un index specializat GIN cu clasa de operatori jsonb_path_ops:
CREATE INDEX idx_clienti_profil_path ON clienti USING gin (profil jsonb_path_ops);
Acest index este mult mai compact decât indexul GIN implicit și accelerează direct operatorii de incluziune (@>) și expresiile compatibile JSON Path.