如何通过连接将 postgresql select 转换为 json 对象?
How to transform a postgresql select with join to a json object?
我想将带有连接的 select 的结果转换为 json 对象。我的意思是这个查询:
select
cm.*,
e.*,
u.*,
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
应该输出这个:
{
"id": 1,
"message": "whatever",
"time": "2021-12-02T00:21:10.571848",
"user": {
"id": 35,
"name": "John Smith"
},
"event": {
"id": 19,
"name": "Test event",
"time": "2021-09-22T00:00:00-03:00",
"local": "Planet Earth"
}
}
(还有比这更多的字段。我只是为了简化示例)
我通过这种方式找到了解决方案:
select
json_build_object(
'id', cm.id,
'message', cm.message,
'time', cm.time,
'user', to_json(u.*),
'event', to_json(e.*)
)
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
但我认为应该有更好的方法来做到这一点。想象一下 chat_messages 有更多的字段。逐个字段描述会很冗长。
我想要的是一种查询在 json 中转换子查询的方法,而无需我逐字段描述。
有人知道更好的方法吗?
根据,Postgres document 您可以使用 row_to_json
函数将行传输到 JSON,然后为每个 table 行附加一个别名,以便 row_to_json
with cte as (
select
cm.*,
e as event,
u as user
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
)
select row_to_json(c) from cte c;
我想将带有连接的 select 的结果转换为 json 对象。我的意思是这个查询:
select
cm.*,
e.*,
u.*,
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
应该输出这个:
{
"id": 1,
"message": "whatever",
"time": "2021-12-02T00:21:10.571848",
"user": {
"id": 35,
"name": "John Smith"
},
"event": {
"id": 19,
"name": "Test event",
"time": "2021-09-22T00:00:00-03:00",
"local": "Planet Earth"
}
}
(还有比这更多的字段。我只是为了简化示例)
我通过这种方式找到了解决方案:
select
json_build_object(
'id', cm.id,
'message', cm.message,
'time', cm.time,
'user', to_json(u.*),
'event', to_json(e.*)
)
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
但我认为应该有更好的方法来做到这一点。想象一下 chat_messages 有更多的字段。逐个字段描述会很冗长。 我想要的是一种查询在 json 中转换子查询的方法,而无需我逐字段描述。 有人知道更好的方法吗?
根据,Postgres document 您可以使用 row_to_json
函数将行传输到 JSON,然后为每个 table 行附加一个别名,以便 row_to_json
with cte as (
select
cm.*,
e as event,
u as user
from
chat_messages cm,
events e,
users u
where
cm.event_id = e.id
and cm.user_id = u.id
)
select row_to_json(c) from cte c;