PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir des éléments du tableau Json dans PostgreSQL

Je ne suis pas sûr que vous ayez un json[] (Tableau PostgreSQL de json values) colonne typée, ou un json colonne typée, qui semble être un tableau JSON (comme dans votre exemple).

Dans les deux cas, vous devez étendre votre tableau avant d'interroger. En cas de json[] , vous devez utiliser unnest(anyarray) ; en cas de tableaux JSON dans un json colonne typée, vous devez utiliser json_array_elements(json) (et LATERAL jointures -- elles sont implicites dans mes exemples) :

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

Malheureusement, vous ne pouvez utiliser aucun index avec vos données. Pour ce faire, vous devez d'abord corriger votre schéma.