如何解决SQL从联接中选择返回键对象
我有一个可以正常工作的SQL查询(Postgres 9.6),该查询返回我需要的信息,但是它并不能完全满足我的需求。
SELECT ARRAY(
SELECT
row_to_json(a.*)
FROM (
SELECT
proj.slug,perm.name AS role
FROM "Projects" proj
INNER JOIN "Permissions" perm
ON perm.project_id = proj.id
INNER JOIN "UserPermissions" up
ON up.permission_id = perm.id
WHERE up.user_id = 1
ORDER BY lower(proj.name)
) a
) as permissions
使用此查询,权限位于一个看起来像
的数组中[
{
slug: 'abcdef',role: 'owner'
},{
slug: 'abcdef',role: 'admin'
},{
slug: 'ghijkl',role: 'member'
}
]
我想将权限作为一个对象,通过slug
将项目组合在一起:
{
'abcdef': {
slug: 'abcdef',roles: ['owner','admin']
},'ghijkl': {
slug: 'ghijkl',roles: ['member']
}
}
目前,我正在使用应用程序代码查询之后执行此操作。
是否可以通过SQL查询直接返回此形状?
解决方法
我认为您需要两个聚合级别。首先,收集与json数组中每个slug
相关的角色(使用JSON_AGG()
),然后使用JSON_OBJECT_AGG()
生成目标json对象:
SELECT JSON_OBJECT_AGG(slug,JSON_BUILD_OBJECT('slug',slug,'roles',roles)) permissions
from (
SELECT pr.slug,json_agg(pe.name) as roles
FROM "Projects" pr
INNER JOIN "Permissions" pe ON pe.project_id = pr.id
INNER JOIN "UserPermissions" up ON up.permission_id = pe.id
WHERE up.user_id = 1
GROUP BY pr.slug
) t
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。