2017-04-18 14 views
0

は、私がこのような構造にJSONオブジェクトを構築するために必要なオブジェクトどのようにこれをより良いものにするか。 私はこの試みた:PostgreSQLとネストされたJSONは

SELECT row_to_json(t, TRUE) 
FROM (
     SELECT 
     id, name 
     , (
      (
       SELECT row_to_json(b) AS first_object 
       FROM (
         SELECT * 
         FROM table1 
         WHERE client_id = 1 
        ) b 
      ), 
      (
       SELECT row_to_json(b) AS second_object 
       FROM (
         SELECT * 
         FROM table2 
         WHERE client_id = 1 
        ) b 
      ) 
      ) AS add_info 

     FROM main_table 
     WHERE id = 1 
    ) t; 

をしかし、私は、この取得しています:

{ 
    "id":1, 
    "name": "Jessica", //other top-level key-values 
    "add_info": { 
     "f1":{"date":"2017-04-17","id":1}, 
     "f2":{"date":"2017-04-17","id":1} //etc. 
    } 
} 

F1、F2を!ワット?

SELECT row_to_json(t, TRUE) 
FROM (
     SELECT 
     id, name 
     , (
      (SELECT row_to_json(first_row) first_row 
       FROM 
       (
        SELECT row_to_json(b) AS first_object 
        FROM (
         SELECT * 
         FROM first_table 
         WHERE client_id = 1 
         ) b 
       ) AS first_row 
      ), 
      (SELECT row_to_json(second_row) second_row 
       FROM 
       (
        SELECT row_to_json(b) AS second_object 
        FROM (
         SELECT * 
         FROM second_table 
         WHERE client_id = 1 
         ) b 
       ) AS second_row 
      ) 
      ) AS add_info 

     FROM main_table 
     WHERE id = 1 
    ) t; 

しかし、これは余分オブジェクト与えます::私は彼らに名前を付けるために何かを行うことができますように

は思え

{ 
    "id":1, 
    "name":"CRED", 
    "add_info":{ 
     "f1":{"first_object":{"date":"2017-04-17","id":1}}, 
     "f2":{"second_object":{"date":"2017-04-17","id":1}} 
    } 
} 

が、私はこの問題を解決することができましたか?

答えて

1

あなたは、共通テーブル式を使用できます。

WITH add_info(first_object, second_object) AS 
    (SELECT 
     (SELECT row_to_json(table1) 
       FROM table1 
       WHERE id = 1 
     ), 
     (SELECT row_to_json(table2) 
       FROM table2 
       WHERE id = 1 
     ) 
    ) 
SELECT row_to_json(t, TRUE) 
FROM (
     SELECT 
     id, name, add_info 
     FROM main_table CROSS JOIN add_info 
     WHERE id = 1 
    ) t; 
+0

を、それは私が必要なもののように思えるのです。複数の '選択 'を避けようとしましたが、今は達成できないようです... – Daria

関連する問題