计算嵌套 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