jsonb 内部字段上的 Postgres GROUP BY
Postgres GROUP BY on jsonb inner field
我正在使用 Postgresql 9.4 并且有一个 table 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
并将每个组 return 作为数组?具体来说,我要查找的结果是:
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)
当右操作数是 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)
我认为 json_agg() 不是在这里使用它的最佳选择,因为这是将内容值(整个 json 数据)连接到特定组的数组中。
使用这样的东西更有意义(我添加了 'count(*)',只是为了有一个更常见的场景):
SELECT content #>> '{a,b}' as a_b, count(*) as count FROM test GROUP BY content #>> '{a,b}';
我正在使用 Postgresql 9.4 并且有一个 table 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
并将每个组 return 作为数组?具体来说,我要查找的结果是:
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)
当右操作数是 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)
我认为 json_agg() 不是在这里使用它的最佳选择,因为这是将内容值(整个 json 数据)连接到特定组的数组中。
使用这样的东西更有意义(我添加了 'count(*)',只是为了有一个更常见的场景):
SELECT content #>> '{a,b}' as a_b, count(*) as count FROM test GROUP BY content #>> '{a,b}';