【发布时间】: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_each、jsonb_build_object 和jsonb_agg。 id 与包含多个用户和权限的 permissions_obj 相关。任何改进查询的建议都非常受欢迎。
【问题讨论】:
标签: postgresql postgresql-10 postgresql-json