我使用的是 PostgreSQL 15,并且在 PL/pgSQL 中有以下两条语句:
-- Statement 1
SELECT to_json(T)
FROM
(SELECT *
FROM category
WHERE category.id = 43) T)
-- Statement 2
SELECT json_build_object('products', JSON_AGG(T))
FROM
(SELECT *
FROM product
WHERE category_id = 43) T
结果:
声明1:
{"id": 43, "name": "television", "description": "flat screen"}
声明2:
{
"products": [{
"id": 423,
"category_id": 43, // Foreign Key
"manufacture": "LG"
}, {
"id": 424,
"category_id": 43,
"manufacture": "Sony"
}, {
"id": 425,
"category_id": 43,
"manufacture": "Samsung"
}]
}
我需要结合这两个 JSON 并获得以下所需的结果:
{
"id": 43,
"name": "television",
"description": "flat screen",
"products": [{
"id": 423,
"category_id": 43,
"manufacture": "LG"
}, {
"id": 424,
"category_id": 43,
"manufacture": "Sony"
}, {
"id": 425,
"category_id": 43,
"manufacture": "Samsung"
}]
}
上面的 JSON 是将第二个 JSON 插入到第一个 JSON 中。
我尝试了
||
,但这导致了一个数组。我需要一个 JSON/JSONB 对象,而不是数组。
我也尝试过
SELECT jsonb_build_object
,但这需要在第一个 JSON 前面有一个 key
,以便每个 JSON 前面都有一个键 - 这不是所需的结果。
怎样才能达到想要的效果?
它对我有用:
SELECT to_json(c.*)::jsonb || json_build_object('products', json_agg(p.*))::jsonb
FROM category c
INNER JOIN product p on p.category_id = c.id
WHERE c.id = 43
GROUP BY c.*