PostgreSQL - JSONB 列的 GROUP_CONCAT

标签 postgresql aggregate group-concat jsonb

我尝试找到一种使用 Postgres 连接 JSONB 值的方法。

例如我有两行:

INSERT INTO "testConcat" ("id", "json_data", "groupID") 
VALUES (1, {"name": "JSON_name1", "value" : "Toto"}, 5);

INSERT INTO "testConcat" ("id", "json_data", "groupID") 
VALUES (2, {"name": "JSON_name2"}, 5);

我想做这样的事情:

SELECT GROUP_CONCAT(json_data)
FROM testConcat
GROUP BY groupID

并且作为获得类似结果的结果:

[{"name": "JSON_name1", "value": "Toto"}, {"name": "JSON_name2"}]

我尝试创建聚合函数,但是当 JSON 中有相同的键时,它们会被合并,只保留最后的值:

DROP AGGREGATE IF EXISTS jsonb_merge(jsonb);

CREATE AGGREGATE jsonb_merge(jsonb) (
    SFUNC = jsonb_concat(jsonb, jsonb),
    STYPE = jsonb,
    INITCOND = '{}'
 );

当我在这里使用这个函数时:

SELECT jsonb_merge(json_data)
FROM testConcat
GROUP BY groupID

结果是:

{"name": "JSON_name2", "value": "Toto"}

而不是我想要的,因为

{"name": "JSON_name1"}

不见了。该函数仅保留不同的键并将另一个键与最后一个值合并。

感谢您的帮助

最佳答案

如果 JSON 文档中始终只有一个键/值对,您可以在不使用自定义聚合函数的情况下执行此操作:

SELECT groupid, jsonb_object_agg(k,v order by id)
FROM testconcat, jsonb_each(json_data) as x(k,v)
group by groupid;

“最后”值由 id 列上的顺序定义

不过,自定义聚合函数可能会更快。

关于PostgreSQL - JSONB 列的 GROUP_CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44679082/

相关文章:

r - 合并R中的重复行,并添加包含重复ID的新列

mysql - 在 group_concat 中包含空结果

mysql - mysql 需要一个分组选项

sql - 'union' 处或附近的 PostgreSQL 语法错误

r - 在 R 中计数并保留出现的顺序

c# - Asp.Net MVC - 使用 Entity Framework + Npgsql.Entityframework 访问 Postgresql

SQL检查取消分组列值是否匹配

MySQL 如何对 Joined 和 Group_Concat 列进行排序?

sql - 查询有问题选择不同的顺序

sql - 无法理解使用 where 和 group by 的子查询代码