PostgreSQL:将两个 JSON 对象合并为一个 JSON 对象

问题描述 投票:0回答:1

我使用的是 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 前面都有一个键 - 这不是所需的结果。

怎样才能达到想要的效果?

sql postgresql subquery plpgsql postgres15
1个回答
0
投票

它对我有用:

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.*
© www.soinside.com 2019 - 2024. All rights reserved.