SQL: SQL异或
SQL: SQL Exclusive Or
我有一个 table 的形式:
username | role
---------+------
name1 | internal
name1 | admin
name2 | internal
name3 | admin
name4 | external
我需要找到所有具有“internal”或“'admin'”角色但不能同时拥有这两种角色(本质上是 XOR)的用户。我如何在 SQL 中执行此操作?
如果查询结果类似于下面的形式,那就完美了:
username | internal | admin
---------+----------+-------
name2 | 1 | 0
name3 | 0 | 1
如果有帮助,我正在使用 Oracle 数据库
试试这个
SELECT UserName,
CASE WHEN Role = 'internal' Then 1 Else 0 END internal,
CASE WHEN Role = 'admin' Then 1 Else 0 END admin
FROM (
SELECT A.*, COUNT(DISTINCT Role) OVER (PARTITION BY UserName) CNT
FROM Users A
) WHERE CNT = 1
我会通过条件聚合来解决这个问题:
select username,
max(case when role = 'internal' then 1 else 0 end) as internal,
max(case when role = 'admin' then 1 else 0 end) as admin
from t
where role in ('internal', 'admin')
group by username
having count(*) = 1;
如果 name/role 对可以重复,则使用 having count(distinct role) = 1
。
我有一个 table 的形式:
username | role
---------+------
name1 | internal
name1 | admin
name2 | internal
name3 | admin
name4 | external
我需要找到所有具有“internal”或“'admin'”角色但不能同时拥有这两种角色(本质上是 XOR)的用户。我如何在 SQL 中执行此操作?
如果查询结果类似于下面的形式,那就完美了:
username | internal | admin
---------+----------+-------
name2 | 1 | 0
name3 | 0 | 1
如果有帮助,我正在使用 Oracle 数据库
试试这个
SELECT UserName,
CASE WHEN Role = 'internal' Then 1 Else 0 END internal,
CASE WHEN Role = 'admin' Then 1 Else 0 END admin
FROM (
SELECT A.*, COUNT(DISTINCT Role) OVER (PARTITION BY UserName) CNT
FROM Users A
) WHERE CNT = 1
我会通过条件聚合来解决这个问题:
select username,
max(case when role = 'internal' then 1 else 0 end) as internal,
max(case when role = 'admin' then 1 else 0 end) as admin
from t
where role in ('internal', 'admin')
group by username
having count(*) = 1;
如果 name/role 对可以重复,则使用 having count(distinct role) = 1
。