【问题标题】:Select case statement: single-row subquery returns more than one rowselect case语句:单行子查询返回多行
【发布时间】:2016-12-20 14:35:23
【问题描述】:

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

这是我的选择案例声明:

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 是超过 1 个用户组的成员。 我如何检查这些用户组之一是否包含“承包商”。

更新: 请让我为你们提供一些关于此的额外信息。

这将在文档管理程序中使用。在这个程序中,我可以创建附加到所有文档的不同属性。在这些属性中,我可以根据选择语句放置值。例如,我创建了一个属性,它将 projectnumber 值添加到在各种项目中创建的文档中。

对于我上面描述的问题,我想要一个属性值 0 或 1。这将控制用户在处理文件时是否可以在程序中执行某些任务。

Example

我在上面写的选择案例语句“几乎”有效。因为如果您将 'Carl' 更改为 'John' 或 'Brian' 我会得到一个正确的值,因为它们只是一个用户组的成员。 但是对于“Carl”或“James”,我会收到错误消息,因为它们属于多个用户组。

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

  • 当“约翰”值 = 0 时
  • 当“卡尔”值 = 1 时
  • 当“詹姆斯”值 = 1 时
  • 当 'Brian' 值 = 0 时

【问题讨论】:

  • 请告诉我们相关表和列的名称。我们可以对其进行逆向工程,但与您告诉我们的情况相比,这需要更多的努力(并且来自每个志愿者,而不是您为我们所有人做一次工作)。
  • 使用EXISTS

标签: sql oracle select case


【解决方案1】:

我不能 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) 结果。

【讨论】:

    【解决方案2】:

    试图猜测您的表格,您可能需要这样的东西:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多