PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erhalten Sie Elemente aus dem Json-Array in PostgreSQL

Ich bin mir nicht sicher, ob Sie einen json[] haben (PostgreSQL-Array von json values) typisierte Spalte oder ein json typisierte Spalte, die ein JSON-Array zu sein scheint (wie in Ihrem Beispiel).

In jedem Fall müssen Sie Ihr Array vor der Abfrage erweitern. Im Fall von json[] , müssen Sie unnest(anyarray) ; im Fall von JSON-Arrays in einem json typisierte Spalte, müssen Sie json_array_elements(json) (und LATERAL Joins -- sie sind in meinen Beispielen implizit enthalten):

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

Leider können Sie keinen Index mit Ihren Daten verwenden. Dazu müssen Sie zuerst Ihr Schema reparieren.