Necesito construir un objeto json en una estructura de este tipo:
{ "id":1, "name": "Jessica", //other top-level key-values "add_info": { "first_object":{"date":"2017-04-17","id":1}, "second_object":{"date":"2017-04-17","id":1} //etc. } }Desafortunadamente, me confundí con esa gran cantidad de funciones json de PostgreSQL excelentes pero no ejemplificadas y no puedo encontrar la manera de lograr esto mejor. Intenté esto:
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;Pero me sale esto:
{ "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 !! ¡¿Qué?!
Parece que puedo hacer algo para darles nombres:
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;Pero esto da un objeto extra :
{ "id":1, "name":"CRED", "add_info":{ "f1":{"first_object":{"date":"2017-04-17","id":1}}, "f2":{"second_object":{"date":"2017-04-17","id":1}} } }¿Puedo arreglar esto?
Podrías usar una expresión de tabla común:
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;