2016-09-18 6 views
0

PostgreSQL 함수에서 왼쪽 조인을 사용하는 두 개의 테이블에서 사용자 정의 json을 빌드하려고 시도했지만 작동하지 않습니다.JSON 객체 내의 PostgreSQL 배열

테이블 구조 :

포스트

id | title | description 

postPhoto

id | postId (FK) | name 

JSON 예 :

{ 
    postId: 1, 
    title: '' 
    description: '', 
    postPhotos: [ 
     {id: 1, name: 'photo1.png'}, 
     {id: 1, name: 'photo2.png'}, 
    ] 
} 
,

SQL 기능 :

$BODY$DECLARE 
    success boolean; 
    msg text; 
    var_most_recent json; 
BEGIN 


SELECT to_json(array_agg(t)) INTO var_most_recent FROM (

    SELECT * 
     (SELECT to_json(array_agg(t)) FROM (
       SELECT * FROM postPhoto AS PP WHERE post.id = PP."postId" 
      )t) 
    FROM post 
    ORDER BY id DESC LIMIT 10 

)t; 

success = TRUE; msg = 'Successfully Returned Post data'; 
RETURN (SELECT json_build_object(
    'success', success, 
    'msg', msg, 
    'body', json_build_object(
     'mostRecent', var_most_recent 
    ) 
)); 

END;$BODY$ 

답변

1

나는 당신이 json_agg 집계 함수를 누락 생각합니다.

SELECT json_agg(p) 
FROM 
    (SELECT 
     json_build_object(
      'postId', post.id, 
      'title', post.title, 
      'description', post.description, 
      'postPhotos', 
       (SELECT json_agg(json_build_object('id',id,'name',name)) 
       FROM postPhoto WHERE postId=post.id) 
     ) AS p 
    FROM post 
    ORDER BY post.id 
    LIMIT 10) as t 
WHERE json_array_length(p->'postPhotos')>1; 
+0

이 작동하지만 난 그렇게 JSON이 같을 것이다 (10)에 의해 제한이 어디를 해달라고 원인 난, 배열에서 여러 게시물을 포장해야합니다 : 여기에 내가 그것을 할 것입니다 방법 HTTP ://pastebin.com/W3MSm8fh – Jazzy

+0

문제가 없지만 다른 SELECT 쿼리로 래핑 할 수 있습니다. 업데이트 된 답변을 참조하십시오. – redneb

+0

postphoto가 null이 아닌 게시물을 선택하도록 도와 줄 수 있습니까? – Jazzy

관련 문제