我正在使用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);
答案 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