2016-06-17 128 views
0

我有一个看起来像这样的记录:PostgreSQL:JSON嵌套元素的SUM?

{ 
    "id": 93824701, 
    "lines": [ 
    {"number": 1, "unit_price": 9.77}, 
    {"number": 2, "unit_price": 8.36} 
    ] 
} 

从查询:

select * from sales where sale @> '{"id": 93824701}'::jsonb; 

如何计算所有unit_prices元素的总和(在SQL),这样结果会是18.13

+1

http://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary-jsonhstore-dynamic-columns/ –

回答

0

JSON不是SQL的一部分,PostgreSQL只是为它提供了一些美味的奖励。将结构化数据存储在普通表中而不是JSON结构中,可以避免将来出现很多问题。

回答这个问题,希望这个小例子可以帮助:

select sum((value->'unit_price')::text::numeric) from jsonb_array_elements('{ 
    "id": 93824701, 
    "lines": [ 
    {"number": 1, "unit_price": 9.77}, 
    {"number": 2, "unit_price": 8.36} 
    ] 
}'::jsonb->'lines'); 

好运。

+0

'sum((value - >'unit_price'):: real' – Patrick

+0

@Patrick我知道'''''提供了仅用于教育目的的类型转换,'real'可能会导致众所周知的计算问题,'数字'是货币的默认类型。 – Abelisto