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::int
和content::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的主要内容,如果未能解决你的问题,请参考以下文章