【问题标题】:How to aggregate array values in JSONB?如何在 JSONB 中聚合数组值?
【发布时间】:2019-12-31 22:42:07
【问题描述】:

我有以下 PostgreSQL 表:

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

其中 data 包含这样的 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;

【问题讨论】:

    标签: json postgresql aggregation jsonb


    【解决方案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. 通过-&gt;&gt; 运算符(给出text 类型)获取数量值并将其转换为int 类型
    3. 如果确实需要,请聚合这些键/值对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多