2016-09-13 2 views
1

쿼리에서 json 출력을 출력해야합니다.PostgreSQL json 및 배열 처리

입력 데이터 :

Documents: 
========== 
id | name | team 
------------------ 
1 | doc1 | {"authors": [1, 2, 3], "editors": [3, 4, 5]} 

Persons: 
======== 
id | name | 
-------------- 
1 | Person1 | 
2 | Person2 | 
3 | Person3 | 
4 | Person4 | 
5 | Person5 | 

검색어 :

select d.id, d.name, 
    (select jsonb_build_object(composed) 
     from 
     (
      select teamGrp.key, 
       (
        select json_build_array(persAgg) from 
         (
          select 
           (
            select jsonb_agg(pers) from 
             (
              select person.id, person.name 
              from 
               persons 
              where (persList.value)::int=person.id 
             ) pers 
           ) 
          from 
           json_array_elements_text(teamGrp.value::json) persList 
         ) persAgg 
       ) 
      from 
       jsonb_each_text(d.team) teamGrp 
     ) teamed 
    ) as teams 
from 
documents d; 

와 나는 다음과 같은 출력 예상 :

ERROR :

{"id": 1, "name": "doc1", "teams": 
    {"authors": [{"id": 1, "name": "Person1"}, {"id": 2, "name": "Person2"}, {"id": 3, "name": "Person3"}], 
    "editors": [{"id": 3, "name": "Person3"}, {"id": 5, "name": "Person5"}, {"id": 5, "name": "Person5"}]} 

그러나이 오류가 발생 이상 한 행이 표현식으로 사용되는 하위 쿼리

문제는 어디에서 수정해야합니까?

PostgreSQL은 9.5

답변

1

나는 다음 (슈퍼 복잡한 쿼리)를하기 위해해야한다고 생각 : 내가 JSON 집계를 실행하는 하위 쿼리를 사용하고

SELECT 
    json_build_object(
     'id',id, 
     'name',name, 
     'teams',(
      SELECT json_object_agg(team_name, 
         (SELECT 
          json_agg(json_build_object('id',value,'name',Persons.name)) 
         FROM json_array_elements(team_members) 
          INNER JOIN Persons ON (value#>>'{}')::integer=Persons.id 
         ) 
        ) 
      FROM json_each(team) t(team_name,team_members) 
     ) 
    ) 
FROM Documents; 

.

+0

감사합니다. 그러나 팀에서는 더 많은 객체가있을 수 있습니다. 작성자와 편집자뿐 아니라 다양한 객체가 있습니다. 나에게는 객체의 배열로서 키와 값을 결합하는 것이 복잡하다. – Tauras

+0

@Tauras 답변을 업데이트 했으므로 다양한 팀을 처리 할 수 ​​있습니다. 사실 그것은 쿼리를 약간 더 단순하게 만들었습니다. – redneb

+0

감사합니다. 그것은 위대한 작품! – Tauras