【问题标题】:Postgres GROUP BY on jsonb inner fieldjsonb内部字段上的Postgres GROUP BY
【发布时间】: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 感谢您的关注!我已经改进了问题、我的尝试,并添加了我想要的结果。

标签: sql json postgresql postgresql-9.4 jsonb


【解决方案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) 非常感谢!我会接受这个作为答案
    • 糟糕,是的,我修好了。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多