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.