从记录的jsonb数组中聚合数值(包括NULL值)

时间:2018-12-27 17:12:54

标签: postgresql casting aggregate jsonb

我正在使用postgres 9.5,我的数据是这样的整数:

id | v1 | v2 | v3
---+----+----+------
 1 | 10 | 3  | null     
 2 | 5  |null| 1
 3 |null| 2  | 7

我已经创建了一个jsonb数组,如下所示:

 [{"v1": 10, "v2": 3, "v3": null}]  

我想进行比较和汇总(即所有v1的总和)。

1)是 jsonb_array_elements 还是正确的操作?

2)如果 jsonb_array_elements 是最好的方法,如何转换为整数并生成 null 值,以便我可以运行比较/积算?

请参见DBFIDDLE

我看过几个堆栈问题,这是我所了解的:

SELECT id, x->'v1' AS v1
FROM   base,jsonb_array_elements(j) t(x);

1 个答案:

答案 0 :(得分:1)

你快到了。

SELECT sum((x->>'v1')::int) AS v1_sum
FROM   base, jsonb_array_elements(j) t(x);

使用->> operator instead of ->获得text值;然后投将jsonb NULL强制转换为integer失败,并且您希望text开始。

如果您有更多的值列,则- operator可能也会变得很有吸引力:从整行中形成一条jsonb记录,然后减去(删除)id键:

SELECT id, json_agg(j1) AS j
FROM  (SELECT id, to_jsonb(t) - 'id' AS j1 FROM t) t1
GROUP  BY id;

db <>提琴here