计算嵌套 jsonb 数组中项目的总和
Calculate sum for items in nested jsonb array
所以我的 Postgres DB table 'purchases' 包含列 'id' 和 'receipt'。 'id' 是主要的 int 列,列 'receipt' 中的值是 jsonb 并且可以如下所示:
{
"shop_name":"some_shop_name",
"items": [
{
"name": "foo",
"spent": 49,
"quantity": 1
},
{
"name": "bar",
"price": 99,
"quantity": 2
},
{
"name": "abc",
"price": 999,
"quantity": 1
},
...
]
}
收据中可以有不同数量的物品。
最后我需要编写一个查询,以便生成的 table 包含 table 中每次购买的购买 ID 和在所有 bar 上花费的金额因此:
id
spent
1
198
..
...
我的问题:
我不知道如何在 select 中使用 jsonb 查询结果 table 中的常规列,我想查询的结构应该是这样的:
SELECT p.id, %jsonb_parsing_result_here% AS spent
FROM purchases p
它阻止我在 FOR 循环中迭代项目(或者可能使用其他方式)。
您可以使用横向连接和 jsonb_array_elements
函数从 receipt
列取消嵌套 items
,例如:
SELECT p.id, SUM((item->>'price')::NUMERIC)
FROM purchases p,
LATERAL jsonb_array_elements(p.receipt->'items') r (item)
GROUP BY p.id
也可以添加 where 条件,例如:
WHERE item->>'name' = 'bar
所以我的 Postgres DB table 'purchases' 包含列 'id' 和 'receipt'。 'id' 是主要的 int 列,列 'receipt' 中的值是 jsonb 并且可以如下所示:
{
"shop_name":"some_shop_name",
"items": [
{
"name": "foo",
"spent": 49,
"quantity": 1
},
{
"name": "bar",
"price": 99,
"quantity": 2
},
{
"name": "abc",
"price": 999,
"quantity": 1
},
...
]
}
收据中可以有不同数量的物品。
最后我需要编写一个查询,以便生成的 table 包含 table 中每次购买的购买 ID 和在所有 bar 上花费的金额因此:
id | spent |
---|---|
1 | 198 |
.. | ... |
我的问题:
我不知道如何在 select 中使用 jsonb 查询结果 table 中的常规列,我想查询的结构应该是这样的:
SELECT p.id, %jsonb_parsing_result_here% AS spent
FROM purchases p
它阻止我在 FOR 循环中迭代项目(或者可能使用其他方式)。
您可以使用横向连接和 jsonb_array_elements
函数从 receipt
列取消嵌套 items
,例如:
SELECT p.id, SUM((item->>'price')::NUMERIC)
FROM purchases p,
LATERAL jsonb_array_elements(p.receipt->'items') r (item)
GROUP BY p.id
也可以添加 where 条件,例如:
WHERE item->>'name' = 'bar