如何聚合 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
的两倍。
然而,这将是查询:
SELECT
elems ->> 'value' AS value,
SUM((elems ->> 'qty')::int) AS qty
FROM
orders,
jsonb_array_elements(data -> 'screws') elems
GROUP BY 1
- 将螺旋阵列扩展为每个阵列元素一行
jsonb_array_elements()
- 通过
->>
运算符获取数量值(给出 text
类型)并将其转换为类型 int
- 如果确实有必要,请汇总这些 key/value 对。
我有以下 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
的两倍。
然而,这将是查询:
SELECT
elems ->> 'value' AS value,
SUM((elems ->> 'qty')::int) AS qty
FROM
orders,
jsonb_array_elements(data -> 'screws') elems
GROUP BY 1
- 将螺旋阵列扩展为每个阵列元素一行
jsonb_array_elements()
- 通过
->>
运算符获取数量值(给出text
类型)并将其转换为类型int
- 如果确实有必要,请汇总这些 key/value 对。