2016-10-13 4 views
0

내가 같은 스키마를 가지고 말 :포스트 그레스에서

table item { 
    type varchar(40) 
    entity_id bigint 
    entity_type varchar(40) 
    user_id bigint 
} 

그리고이 같은 정보를 얻을 수있는 테이블을 조회 할 :

{ 
    "typeA": { 
     "count": 3, 
     "me": true 
    }, 
    "typeC": { 
     "count": 3, 
     "me": false 
    }, 
    "typeE": { 
     "count": 3, 
     "me": false 
    }, 
    "typeR": { 
     "count": 3, 
     "me": true 
    } 
} 

에서을 주 데이터이있는 쿼리 :

SELECT ARRAY_AGG(x) 
    FROM 
    (
     SELECT type, 
     count(*), 
     (CASE 
      WHEN (SELECT id 
       FROM items as i 
       WHERE i.entity_type = 'sometype' 
        AND i.entity_id = 234 
        AND i.user_id = 32 
        AND i.type = items.type) is not null 
      THEN true 
      ELSE false 
     END) AS me 
     FROM items 
     WHERE items.entity_type = 'sometype' 
     AND items.entity_id = 234 
     GROUP BY type 
    ) as x 

이 내가 형의 수와 나를 필요로하는 정보의 배열을 반환합니다. 하지만 위와 같이 형식이 필요합니다.

[ 
    { 
     "type": "typeA", 
     "count": 3, 
     "me": true 
    }, 
    { 
     "type": "typeC", 
     "count": 3, 
     "me": false 
    }, 
    { 
     "type": "typeE", 
     "count": 3, 
     "me": false 
    }, 
    { 
     "type": "typeR", 
     "count": 3, 
     "me": true 
    } 
] 

형식이 현재 사용되는 방식은 다음과 같습니다. 필요한 json 객체를 빌드하는 방법을 찾을 수 없습니다. 나는 3 개의 json 객체를 얻을 수있었습니다. 그러나 하나의 객체에 3 개의 중첩 된 객체가 필요합니다.

답변

0

정확하게 원하는 것은 아니지만, PostgreSQL - Aggregate Functions에서 나는 json_object_agg(name, value)을 시도 할 수 있습니다.

SELECT JSON_OBJECT_AGG(type, x) 
    FROM 
    (
     SELECT type, 
     count(*), 
     (CASE 
      WHEN (SELECT id 
       FROM items as i 
       WHERE i.entity_type = 'sometype' 
        AND i.entity_id = 234 
        AND i.user_id = 32 
        AND i.type = items.type) is not null 
      THEN true 
      ELSE false 
     END) AS me 
     FROM items 
     WHERE items.entity_type = 'sometype' 
     AND items.entity_id = 234 
     GROUP BY type, me 
    ) as x 
+0

이것은 완벽하게 작동하지만 형식이 추가되었지만 괜찮습니다. 고마워, 올리브. :) – wizardofmath

관련 문제