【问题标题】:Aggregate numeric values from jsonb array of records (including NULL values)从 jsonb 记录数组中聚合数值(包括 NULL 值)
【发布时间】:2019-05-25 16:34:14
【问题描述】:

我使用的是 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 sum all 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);

【问题讨论】:

  • 您忘记声明您的 Postgres 版本。
  • 已编辑,再次感谢。你的答案总是那么准确。如果你曾经做过关于 postgres 的在线课程,我会是第一个注册的。

标签: postgresql casting aggregate jsonb


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多