【问题标题】:Posgresql - jsonb object reduce without a subqueryPostgresql - 没有子查询的 jsonb 对象减少
【发布时间】:2019-11-25 15:07:54
【问题描述】:

我有一个jsonb 列,具有这样的用户权限(这是一条记录的值):

{
   "user_1":{
      "permissions":[
         "edit",
         "view"
      ]
   },
   "user_2":{
      "permissions":[

      ]
   },
   "user_3":{
      "permissions":[
         "view"
      ]
   }
}

我想要实现的是将这个 jsonb 对象转换成这样的 jsonb 对象数组:

[
   {
      "login":"user_1",
      "permissions":[
         "edit",
         "view"
      ]
   },
   {
      "login":"user_2",
      "permissions":[

      ]
   },
   {
      "login":"user_3",
      "permissions":[
         "view"
      ]
   }
]

只需将登录密钥“移动”到单独的字段并将其作为数组进行索引。

问题是:
是否可以在没有子查询的情况下在 PostgreSQL(10.x 版)中做到这一点?

这是我的带有子查询的版本:

SELECT jsonb_agg(jsonb_build_object('login', tbl.key, 'permissions', tbl.value->'permissions')), id FROM (
    SELECT (jsonb_each(permissions_tbl.permissions_obj)).*, id
    FROM (
        SELECT '{"user_1": {"permissions": ["edit", "view"]}, "user_2": {"permissions": []}, "user_3": {"permissions": ["view"]}}'::jsonb permissions_obj, 123 id
    ) as permissions_tbl

) as tbl GROUP BY id;

我使用了jsonb_eachjsonb_build_objectjsonb_aggid 与包含多个用户和权限的 permissions_obj 相关。任何改进查询的建议都非常受欢迎。

【问题讨论】:

    标签: postgresql postgresql-10 postgresql-json


    【解决方案1】:

    Click: step-by-step demo:db<>fiddle

    SELECT
        jsonb_agg(                                  -- 4
            jsonb_build_object('login', key)        -- 2            
            || value                                -- 3
        )
    FROM
        mytable,
        jsonb_each(mydata)                          -- 1
    
    1. 将 JSON 对象展开为每个元素一行。这将创建两个新列:key(这是您的 logins)和 value(这是您的 permissions 对象)
    2. logins 创建一个新的 JSON 对象
    3. permissions 对象添加到新的 JSON 对象中
    4. 将它们重新聚合到 JSON 数组中

    【讨论】:

    • 很好的答案@S-Man - 谢谢!正是我想要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2015-04-13
    • 2017-07-15
    • 2019-02-17
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多