Postgresql - 没有子查询的jsonb对象减少
Posgresql - jsonb object reduce without a subquery
我有一个 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"
]
}
]
只需 "move" 登录键到一个单独的字段并将其作为数组索引。
问题是:
是否可以在没有子查询的情况下在 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
相关。非常欢迎任何改进查询的建议。
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
- 将 JSON 对象扩展为每个元素一行。这将创建两个新列:
key
(这是您的 login
)和 value
(这是您的 permissions
对象)
- 为
login
s 创建一个新的 JSON 对象
- 将
permissions
个对象添加到新的 JSON 个对象中
- 将它们重新聚合成一个 JSON 数组
我有一个 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"
]
}
]
只需 "move" 登录键到一个单独的字段并将其作为数组索引。
问题是:
是否可以在没有子查询的情况下在 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
相关。非常欢迎任何改进查询的建议。
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
- 将 JSON 对象扩展为每个元素一行。这将创建两个新列:
key
(这是您的login
)和value
(这是您的permissions
对象) - 为
login
s 创建一个新的 JSON 对象
- 将
permissions
个对象添加到新的 JSON 个对象中 - 将它们重新聚合成一个 JSON 数组