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

Come ottenere elementi dall'array Json in PostgreSQL

Non sono sicuro che tu abbia un json[] (Matrice PostgreSQL di json valori) o una colonna json colonna digitata, che sembra essere un array JSON (come nel tuo esempio).

In ogni caso, è necessario espandere l'array prima di eseguire query. In caso di json[] , devi usare unnest(anyarray) ; in caso di array JSON in un json colonna digitata, è necessario utilizzare json_array_elements(json) (e LATERAL join -- sono impliciti nei miei esempi):

select     t.id,
           each_section ->> 'name' section_name,
           each_attribute ->> 'attrkey3' attrkey3
from       t
cross join unnest(array_of_json) each_section
cross join json_array_elements(each_section -> 'attributes') each_attribute
where      (each_attribute -> 'attrkey3') is not null; 
-- use "where each_attribute ? 'attrkey3'" in case of jsonb


select     t.id,
           each_section ->> 'name' section_name,
           each_attribute ->> 'attrkey3' attrkey3
from       t
cross join json_array_elements(json_array) each_section
cross join json_array_elements(each_section -> 'attributes') each_attribute
where      (each_attribute -> 'attrkey3') is not null;

SQLFiddle

Sfortunatamente, non puoi utilizzare alcun indice con i tuoi dati. Devi prima correggere il tuo schema, per farlo.