首页 > 解决方案 > Postgresql WHERE 子句使用条件子查询

问题描述

我有一种情况,每个客户都有用户,每个用户都可以访问有关一个或多个分支机构的信息。我们还有系统管理员可以查看所有内容,并且在数据库中没有分配给他们的任何站点。它只是说用户是系统管理员,所以我们的系统不限制访问。

我需要进行数据库查询,在其中提取用户有权访问的分支列表,但如果用户是系统管理员,我想提取系统中所有分支的列表。

我正在尝试这样的事情,但它不起作用:

Select sites.name, sites.id
FROM sites
WHERE
sites.id IN (
    CASE 
      WHEN (select u.level FROM users "u" WHERE u.username = 'JohnBrown') ='ROLE_SYSTEM_ADMIN'
    THEN
       (select id FROM sites)
    ELSE
       (select s2.id FROM users_have_sites uhs2
                            left join users u2 ON u2.id = uhs2.user_id
                            left join sites s2 ON s2.id = uhs2.site_id
                            where u2.username = 'JonhBrown')
    END
)

我收到此错误: ERROR: more than one row returned by a subquery used as an expression

标签: postgresql

解决方案


我认为这可以满足您的要求:

select s.name, s.id 
from sites s
inner join users u on u.username = 'JohnBrown'
where   
    u.level = 'ROLE_SYSTEM_ADMIN'
    or exists (
        select 1
        from users_have_sites uhs
        where uhs.site_id = s.id and uhs.user_id = u.id
    )

这是另一个版本的查询,您可能会发现它更容易理解(我愿意):

select s.name, s.id 
from users u
inner join sites s
    on u.level = 'ROLE_SYSTEM_ADMIN'
    or exists (
        select 1
        from users_have_sites uhs
        where uhs.site_id = s.id and uhs.user_id = u.id
    )
where u.username = 'JohnBrown'

推荐阅读