PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter elementos do array Json no PostgreSQL


Não tenho certeza se você tem um json[] (Matriz PostgreSQL de json valores) coluna digitada ou um json coluna digitada, que parece ser uma matriz JSON (como no seu exemplo).

Em ambos os casos, você precisa expandir sua matriz antes de consultar. No caso de json[] , você precisa usar unnest(anyarray) ; no caso de arrays JSON em um json coluna digitada, você precisa usar json_array_elements(json) (e LATERAL joins -- eles estão implícitos em meus exemplos):
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

Infelizmente, você não pode usar nenhum índice com seus dados. Você precisa corrigir seu esquema primeiro, para fazer isso.