如何聚合 JSONB 中的数组值?

How to aggregate array values in JSONB?

我有以下 PostgreSQL table:

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;

我不太确定您为什么要尝试对 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. 如果确实有必要,请汇总这些 key/value 对。