从 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?
我看了几个堆栈问题,这是我得到的:
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
我使用的是 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?
我看了几个堆栈问题,这是我得到的:
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