如何在JSONB中聚合数组值?

时间:2019-08-27 17:54:18

标签: json postgresql aggregation jsonb

我有以下PostgreSQL表:

CREATE TABLE orders
(
    id uuid NOT NULL,
    order_date timestamp without time zone,
    data jsonb
);

其中数据包含这样的json文档:

{
    "screws": [
        {
            "qty": 1000,
            "value": "Wood screw"
        },
        {
            "qty": 500,
            "value": "Drywall screw"
        },
        {
            "qty": 500,
            "value": Concrete screw"
        }
    ],
    "nails": [
        {
            "qty": 1000,
            "value": "Round Nails"
        }
    ]
}

如何获得所有订单中所有类型螺钉的总量?像这样的东西:)

select value, sum(qty) from orders where section = 'screws' group by value;

1 个答案:

答案 0 :(得分:1)

我不太确定您为什么要对qty值求和,因为GROUP BY value仅在相同的value可以求和的几倍时才有意义,例如如果您的值Wood screw为两倍。

不过,这将是查询:

step-by-step demo:db<>fiddle

SELECT
    elems ->> 'value' AS value,
    SUM((elems ->> 'qty')::int) AS qty
FROM
    orders,
    jsonb_array_elements(data -> 'screws') elems
GROUP BY 1
  1. 通过jsonb_array_elements()将丝杠数组扩展为每个数组元素一行。
  2. 通过->>运算符(给出text类型)获取数量值,并将其转换为int类型
  3. 如果确实有必要,请汇总这些键/值对。