在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 ,但无法找到正确的查询。你能帮帮我吗?
非常感谢提前
答案 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