对JSONB数组字段中的所有项求和

时间:2016-09-01 19:53:52

标签: sql ruby-on-rails json postgresql jsonb

如果我的表设置如下:

indicators:
  id: 56789,
  funding (JSONB): [
    {
      amount: 345678
    },
    {
      amount: 7899
    }
  ]

我可以成功地将每条记录的第一笔金额与:

相加

Rails - Indicator.sum("(funding->0->>'amount')::float")

SQL - SELECT SUM((funding->0->>'amount')::float) FROM "indicators"

您如何查询所有amounts(不仅仅是0个索引项)的总和?

运行Rails 5& Postgres 9.5.4。

注意:这篇文章类似于How do I query using fields inside the new PostgreSQL JSON datatype? - 但我正在寻找一种迭代每个数组元素的方法来总结它们(而不是直接通过它们调用它们)索引号)。

更新... 感谢@klin在下面的回答,我能够把Rails版本放在一起,这个版本给了我总计:

Indicator.joins("cross join lateral jsonb_array_elements(funding)").sum("(value->>'amount')::float")

1 个答案:

答案 0 :(得分:4)

使用jsonb_array_elements()

select sum((value->>'amount')::float)
from indicators
cross join lateral jsonb_array_elements(funding)