postgresql - 如何以 JSON 层次结构返回数据?
问题描述
对于pg12中的以下数据表和函数
create table orders
(
orderid integer, grandtotal numeric(10, 2)
)
create table odetails
(
orderid integer, detailid integer, description text
)
create function jorder() returns json as
begin
return query select od.orderid, od.grandtotal, ds.detailid, ds.description
from orders od
join odetails ds on od.orderid = ds.orderid;
end;
如何在如下 JSON 层次结构中获取返回数据?
[{
"orderid": 1,
"grandtotal": 100.00,
"details": [{
"detailid": 11,
"description": "pen"
},
{
"detailid": 12,
"description": "orange"
}
]
}, {
"orderid": 2,
"grandtotal": 200.00,
"details": [{
"detailid": 21,
"description": "book"
},
{
"detailid": 22,
"description": "coffee"
},
{
"detailid": 23,
"description": "tea"
}
]
}]
解决方案
您应该查看json 函数。您需要json_build_object
形成对象并将json_agg
它们聚合到 json 数组中:
CREATE FUNCTION jorder()
RETURNS json
LANGUAGE sql
AS $$
SELECT
json_agg(orders.order)
FROM (
SELECT
json_build_object(
'orderid', od.orderid,
'grandtotal', od.grandtotal,
'details', array_agg(
json_build_object(
'detailid', ds.detailid,
'description', ds.description
)
)
) as order
FROM
orders od
JOIN odetails ds on od.orderid = ds.orderid
GROUP BY
od.orderid, od.grandtotal
) as orders
$$;
db<>fiddle的示例
推荐阅读
- mysql - SQL - 如何在 mysql 的行中获取先前的值和 nexrt 值?
- javascript - 是否仅在“状态”更改或“道具”更改时才调用“渲染”方法?
- enums - 如何构造/解构枚举的枚举?
- python-3.x - 使用 pyplot.close() 使烧瓶应用程序崩溃
- java - 将 JButtons 添加到滚动窗格
- javascript - 切换 React 嵌入小部件 onClick
- android - android sharedPreferences的清除功能不起作用
- arrays - 快速表达
("column", <#[Binding?]#>) 这个绑定是什么? - android - 改造无密钥解析json数组
- .htaccess - 如何允许带有禁止任意 HTTP 方法规则的 url