我正在尝试确定员工是否是特定用户区的成员,其中“承包商”一词是其中的一部分。所有员工都可以成为多个用户组的一部分,因此我得到了错误。
这是我的选择案例陈述:
SELECT CASE WHEN
(SELECT usergroup FROM usergr
WHERE usergroupnumber = (SELECT usergroupnumber FROM userlist
WHERE username='Carl'))
LIKE '%contractor%' THEN 1
ELSE 0
END FROM DUAL
现在正是这个子查询返回超过1行,因为Carl是多个用户组的成员。 如何检查其中一个用户组是否包含“承包商”。
更新 请允许我向你们提供一些关于此的更多信息。
这将用于文档管理程序。在这个程序中,我可以创建附加到所有文档的不同属性。在这些属性中,我可以根据select语句放置值。例如,我创建了一个属性,它将projectnumber值添加到在各种Projects中创建的文档中。
对于我上面描述的问题,我想要一个值为0或1的属性。这将控制用户在处理文件时是否可以执行程序中的某些任务。
我上面写的“几乎”的选择案例陈述有效。因为如果你用'John'或'Brian'改变'Carl',我会得到一个正确的值,因为它们只是一个用户组的成员。 但是对于'Carl'或'James',我得到了错误,因为它们是多个用户组的一部分。
如果您使用我给出的'示例',我想要以下结果:
答案 0 :(得分:0)
我不是100%确定如何使用查询,但以下将返回1,其中有一个名为Carl的用户加入了一个拥有'承包商'作为用户组的一部分。
SELECT 1
FROM dual
WHERE EXISTS (SELECT 1
FROM usergr ug
INNER JOIN userlist ul
ON ug.usergroupnumber = ul.usergroupnumber
WHERE ug.usergroup LIKE '%contractor%'
AND ul.username = 'Carl')
这里真正发生的一件事是,加入usergr表到userlist表的潜在多重结果被EXISTS子句解析为一个简单的true(1)/ false(null)结果。
答案 1 :(得分:0)
尝试猜测你的桌子,你可能需要这样的东西:
with userlist(username, usergroupnumber) as (
select 'Carl', 1 from dual union all
select 'Carl', 2 from dual union all
select 'John', 2 from dual
),
usergr (usergroupnumber, usergroup) as (
select 1, '__contractor__' from dual union all
select 2, 'XXXXXXXXXXXXXX' from dual union all
select 3, 'YYYYYYYYYYYYYY' from dual
)
SELECT case
when count(1) = 0
then 0
else 1
end
FROM userlist ul
inner join usergr ug
on ( ug.usergroupnumber = ul.usergroupnumber)
WHERE ul.username='Carl'
and usergroup like '%contractor%'
请注意,您不需要DUAL
,但您只需对count
的结果应用一些逻辑即可获得“布尔”值(0/1)