我使用的是 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 值以便我可以运行比较/聚合?
参见 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
关于postgresql - 从 jsonb 记录数组中聚合数值(包括 NULL 值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53948558/