PostgreSQL中json数组的值的总和

时间:2014-11-02 13:06:25

标签: arrays json postgresql

在PostgreSQL 9.3中,我有一个这样的表

id | array_json
---+----------------------------
1  | ["{123: 456}", "{789: 987}", "{111: 222}"]
2  | ["{4322: 54662}", "{123: 5121}", "{1: 5345}" ... ]
3  | ["{3232: 413}", "{5235: 22}", "{2: 5453}" ... ]
4  | ["{22: 44}", "{12: 4324}", "{234: 4235}" ... ]
...

我想获得 array_json列中所有值的总和。所以,例如,对于第一行,我想要:

id | total
---+-------
1  | 1665

其中 1665 = 456 + 987 + 222 (json数组的所有元素的值)。以前没有关于json元素的键的信息(只是随机数)

我正在阅读有关JSON functions in PostgreSQL 9.3的文档页面,我认为我应该使用 json_each ,但无法找到正确的查询。你能帮帮我吗?

非常感谢提前

2 个答案:

答案 0 :(得分:1)

您开始寻找合适的位置(转到文档总是正确的位置)。

由于您的值是JSON数组 - >我建议使用json_array_elements(json)

因为它是一个json数组,你必须爆炸到几行,然后通过运行总和json_each_text(json)来组合 - 最好创建自己的函数(Postgres允许它)

至于你的具体情况,假设你提供的结构是正确的,可以使用一些字符串解析+ JSON繁重的魔法(假设你的表名是“json_test_table”,列是“id”和“json_array”),这是执行“事物”的查询

select id, sum(val) from 
    (select id,
     substring(
        json_each_text(
          replace(
           replace(
            replace(
             replace(
              replace(json_array,':','":"')
             ,'{',''),
            '}','')
           ,']','}')
          ,'[','{')::json)::varchar 
     from '\"(.*)\"')::int  as val  
   from json_test_table) j group by id ; 

如果您计划在庞大的数据集上运行它 - 请记住字符串操作在性能方面是昂贵的

答案 1 :(得分:0)

你可以使用它来获取它:

/*
Sorry, sqlfiddle is busy :p
CREATE TABLE my_table
(
  id bigserial NOT NULL,
  array_json json[]
  --,CONSTRAINT my_table_pkey PRIMARY KEY (id)
)

INSERT INTO my_table(array_json)
   values (array['{"123": 456}'::json, '{"789": 987}'::json, '{"111": 222}'::json]);
*/   

select id, sum(json_value::integer)
from
(
select id, json_data->>json_object_keys(json_data) as json_value from
    (
    select id,  unnest(array_json) as json_data from my_table
    ) A
) B 
group by id