使用Postgres中的JSON函数将Column值设为键

时间:2017-06-09 06:47:21

标签: sql json postgresql

我正在使用Postgres数据库,并有一个表格如下

Table Name: Test

id    firstname    lastname
 1     Sam          Crews
 2     John         Dave

我试图将结果设置回JSON格式以下,但没有运气

预期:

[{"1": {"firstname": "Sam", "lastname": "Crews"}},
 {"2": {"firstname": "John", "lastname": "Dave"}}
]

我尝试使用 row_to_json json_build_object 函数,但输出略有不同(如下所示)。

实际值:

[{"id": "1", "firstname": "Sam", "lastname": "Crews"},
 {"id": "2", "firstname": "John", "lastname": "Dave"}
]

非常感谢任何有关如何达到预期结果的指示。

谢谢!

2 个答案:

答案 0 :(得分:2)

row_to_json()将始终使用所有列名称在JSON文档中创建键。如果您只想要两列,则需要明确指定它们。

您还需要一个嵌套的JSON对象,因此您需要嵌套方法来创建一个:

select json_agg(json_build_object(
                 id, 
                 json_build_object('firstname', firstname, 'lastname', lastname))
                )
from the_table;

Klin让我意识到,使用Postgres 9.6,您可以简化firstname / lastname对象的创建:

select json_agg(json_build_object(id, to_jsonb(the_table) - 'id'))
from the_table;

答案 1 :(得分:1)

with my_table(id, firstname, lastname) as (
values
(1, 'Sam', 'Crews'),
(2, 'John', 'Dave')
)

select jsonb_agg(obj)
from my_table,
jsonb_build_object(id, to_jsonb(my_table)- 'id') obj

                                              jsonb_agg                                               
------------------------------------------------------------------------------------------------------
 [{"1": {"lastname": "Crews", "firstname": "Sam"}}, {"2": {"lastname": "Dave", "firstname": "John"}}]
(1 row)