0

我有一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_aggidpermissions_obj包含多个用户和权限有关。任何改进查询的建议都非常受欢迎。

4

1 回答 1

2

点击:逐步演示:db<>fiddle

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