我有一个包含三列的表:id
,name
和position
。我想创建一个JSON数组,如下所示:
[
{"id": 443, "name": "first"},
{"id": 645, "name": "second"}
]
这应该由position
列列出。
我开始使用以下查询:
with output as
(
select id, name
from the_table
)
select array_to_json(array_agg(output))
from output
这很有效。现在我想添加订单。我从这开始:
with output as
(
select id, name, position
from the_table
)
select array_to_json(array_agg(output order by output.position))
from output
现在输出如下:
[
{"id": 443, "name": "first", "position": 1},
{"id": 645, "name": "second", "position": 2}
]
但我不想在输出中输入position
字段。
我正面临一个鸡蛋问题:我需要position
列才能订购,但我也不想要position
列,因为我没有&# 39; t想要它在结果输出中。
我该如何解决这个问题?
我不认为以下查询是正确的,因为表格排序(理论上)不会在查询之间保留:
with output as
(
select id, name
from the_table
order by position
)
select array_to_json(array_agg(output))
from output
答案 0 :(得分:1)
有两种方法(至少):
构建JSON对象:
with t(x,y) as (values(1,1),(2,2))
select json_agg(json_build_object('x',t.x) order by t.y) from t;
或删除不必要的密钥:
with t(x,y) as (values(1,1),(2,2))
select json_agg((to_jsonb(t)-'y')::json order by t.y) from t;
请注意,在第二种情况下,您需要一些类型转换,因为-
运算符仅为JSONB
类型定义。
另请注意,我使用了直接JSON聚合json_agg()
而不是对array_to_json(array_agg())