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

标签 postgresql casting aggregate jsonb

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

相关文章:

c# - Postgres analog for c# SQL Server´s stored procedure CLR

用于按顺序提取记录的 SQL 查询

c - 是否通过强制转换为已签名的未定义行为来检测未签名的环绕?

java - 奇怪的 Java 转换异常。为什么我不能将 Long 转换为 Float?

r - 在 R 中使用聚合为另一个变量的相同值查找一个变量的唯一值

sql - 获取 n 个分组类别并将其他类别加总为一个

postgresql - 何时打开/关闭与数据库的连接?

postgresql - 使用 GeoAlchemy2 按距离选择和排序。错误的 ST_AsBinary 换行

java - 将字节的十进制值再次转换为字节

Delphi 客户端数据集查找/聚合