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

Aggregate numeric values from jsonb array of records (including NULL values)

我使用的是 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}]  

我想要 运行 比较和聚合(IE 对所有 v1 求和)。

1) jsonb_array_elements 是正确的操作还是有更简单的方法?

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

DBFIDDLE

我看了几个堆栈问题,这是我得到的:

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

你快到了。

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<>fiddle here