Interogări Declarative cu JSON Path în PostgreSQL (jsonb_path_query) în PostgreSQL

Date Structurate și JSON PostgreSQL 12+

Ghid complet pentru standardul SQL/JSON Path în PostgreSQL 12+: filtrarea și extragerea elementelor din documente JSONB complexe cu jsonb_path_query, jsonb_path_exists și predicate avansate.

Sintaxă SQL
jsonb_path_query(target, '$.comenzi[*] ? (@.total > 500).articole[*].nume')

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.

Exemplu practic: Extragerea produselor dintr-o comandă JSONB
-- 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).
Filtrare eficientă în clauza WHERE cu jsonb_path_exists
-- 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.