jsonb内部字段上的Postgres GROUP BY

Posted

技术标签:

【中文标题】jsonb内部字段上的Postgres GROUP BY【英文标题】:Postgres GROUP BY on jsonb inner field 【发布时间】:2017-01-08 17:46:34 【问题描述】:

我使用的是 Postgresql 9.4,有一个表test,有id::intcontent::jsonb,如下:

 id |     content
----+-----------------
  1 | "a": "b": 1
  2 | "a": "b": 1
  3 | "a": "b": 2
  4 | "a": "c": 1

我如何在content 列的内部字段上GROUP BY 并将每个组作为数组返回?具体来说,我正在寻找的结果是:

             content
---------------------------------
["a": "b": 1,"a": "b": 1]
["a": "b": 2]
(2 rows)

尝试:

SELECT json_agg(content) as content FROM test GROUP BY content ->> 'a,b';

产量:

                               content
----------------------------------------------------------------------
["a": "b": 1, "a": "b": 1, "a": "b": 2, "a": "c": 1]
(1 row)

【问题讨论】:

请编辑您的问题并提供您正在寻找的结果。 @GordonLinoff 感谢您的关注!我已经改进了问题、我的尝试,并添加了我想要的结果。 【参考方案1】:

我认为 json_agg() 不是在这里使用它的最佳选择,因为它会将内容值(整个 json 数据)连接到特定组的数组中。 使用这样的东西更有意义(我添加了'count(*)',只是为了有一个更常见的场景):

SELECT content #>> 'a,b' as a_b, count(*) as count FROM test GROUP BY content #>> 'a,b';

【讨论】:

【参考方案2】:

当右操作数是 json 路径时,您必须使用 #>> 运算符而不是 ->>。试试这个:

SELECT json_agg(content) as content FROM test GROUP BY content #>> 'a,b';

产量:

              content
------------------------------------
 ["a": "c": 1]
 ["a": "b": 2]
 ["a": "b": 1, "a": "b": 1]
(3 rows)

【讨论】:

我假设您打算在您的答案中替换 #>>SELECT json_agg(content) as content FROM test GROUP BY content #>> 'a,b'; content ------------------------------------ ["a": "c": 1] ["a": "b": 2] ["a": "b": 1, "a": "b": 1] (3 rows) 非常感谢!我会接受这个作为答案 糟糕,是的,我修好了。

以上是关于jsonb内部字段上的Postgres GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:查询多个jsonb字段

Postgres 检查空 JSONB 字段

jsonb字段上的Spring-Data-JPA本机查询

从 Postgres 中的 JSONB 字段中选择不为空的值

如何将postgres jsonb字段的属性插入键值表?

如何在 Vapor/Fluent 中正确查询 Postgres JSONB 字段