选择case语句:单行子查询返回多行

时间:2016-12-20 14:35:24

标签: sql oracle select case

我正在尝试确定员工是否是特定用户区的成员,其中“承包商”一词是其中的一部分。所有员工都可以成为多个用户组的一部分,因此我得到了错误。

这是我的选择案例陈述:

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的属性。这将控制用户在处理文件时是否可以执行程序中的某些任务。

Example

我上面写的“几乎”的选择案例陈述有效。因为如果你用'John'或'Brian'改变'Carl',我会得到一个正确的值,因为它们只是一个用户组的成员。 但是对于'Carl'或'James',我得到了错误,因为它们是多个用户组的一部分。

如果您使用我给出的'示例',我想要以下结果:

  • 当'John'值= 0时
  • 当'Carl'值= 1时
  • 当'James'值= 1时
  • 当'Brian'值= 0时

2 个答案:

答案 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)