postgresql - 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
解决方案
我认为这可以满足您的要求:
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'
推荐阅读
- ruby-on-rails - 如何按has_many最后一个活动字段对rails模型进行排序?
- android - 运行 Cordova build Android 时出现问题
- reactjs - 警告:React.createElement:类型无效
- python - 编写简单的python函数
- bash - Bash 嵌套自动完成调用嵌套函数
- apache-kafka - mapR Kafka 无法启动第二轮
- swift - 解包选项(Swift Playground)
- typescript - 在函数类型中使用泛型
- ios - UICollectionViewCell 选择后不更新视图
- python - 使用 langdetect 计算 pandas 数据框中的语言频率