【问题标题】:How to Display null if desired value is not found using SQL如果使用 SQL 找不到所需的值,如何显示 null
【发布时间】:2021-10-18 16:52:45
【问题描述】:

我有一个系统,其中有多个角色的用户,有些人最多可以分配 5 个不同的角色,我想构建一个查询,我可以在其中显示用户名,如果他们有特定的角色,然后如果他们有第二个特定角色。如果他们这样做,那么两者都会填充,但如果他们只有第一个角色,那么第二列将显示为空白。

我知道我下面的内容是错误的,因为它只会在用户同时拥有两个角色时才显示,但是否可以输入 IF 语句或类似的语句,从而第二个角色列将显示第二个角色,或者如果没有其他角色分配或分配任何其他角色显示空值?

SELECT USERS.USER_NAME, USER_ROLE.USER_ROLE, USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS, SYSTEM.USER_ROLE USER_ROLE, SYSTEM.USER_ROLE USER_ROLE_1
WHERE USERS.USER_NAME = USER_ROLE_1.USER_NAME AND USERS.USER_NAME = USER_ROLE.USER_NAME 
      AND ((USER_ROLE.USER_ROLE = 'MASTER') AND (USER_ROLE_1.USER_ROLE='ADMIN'))

另外我不想要重复,这就是为什么我没有尝试某种显示用户,如果他们有角色 1 或角色 1 和角色 2 等,如下所示

SELECT USERS.USER_NAME, USER_ROLE.USER_ROLE, USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS, SYSTEM.USER_ROLE USER_ROLE, SYSTEM.USER_ROLE USER_ROLE_1
WHERE USERS.USER_NAME = USER_ROLE_1.USER_NAME AND USERS.USER_NAME = USER_ROLE.USER_NAME AND (((USER_ROLE.USER_ROLE = 'MASTER') AND (USER_ROLE_1.USER_ROLE='ADMIN')) OR (USER_ROLE.USER_ROLE = 'MASTER'))

【问题讨论】:

  • 欢迎来到 SO。对于您的第一个问题,您需要使用left outer join。那里有大量的信息。

标签: sql


【解决方案1】:

您应该了解有关联接的更多信息。您的语法可能对您有用,但您编写的格式使其难以分析。试试这样的:

SELECT USERS.USER_NAME
    ,USER_ROLE.USER_ROLE
    ,USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS
    INNER JOIN SYSTEM.USER_ROLE USER_ROLE
        ON USERS.USER_NAME = USER_ROLE.USER_NAME
    LEFT OUTER JOIN SYSTEM.USER_ROLE USER_ROLE_1
        ON USERS.USER_NAME = USER_ROLE_1.USER_NAME
WHERE (((USER_ROLE.USER_ROLE = 'MASTER') 
        AND (USER_ROLE_1.USER_ROLE='ADMIN')
        ) 
    OR (USER_ROLE.USER_ROLE = 'MASTER')
    )

我不知道这里的数据是什么样的,但是我列出了如何使用“ON”子句编写连接的方式应该对您有所帮助。正如@Andrew 指出的那样,LEFT OUTER JOIN 似乎适合在每条记录中可能没有匹配值的表。您仍将输出其他表中的记录,不匹配的字段显示为“NULL”。

【讨论】:

  • 嘿,谢谢你,这确实可以运行。然而,这个问题是如果用户有多个额外的角色(比如说采样器和审阅者),那么该表对于同一用户有三行,1)主和管理员,2)主和采样器以及 3)主和审阅者。相反,我只想要每个用户一行,并且该行显示 Role1 和指示的 Role2 或第二列中的空白字段,表示他们没有第二个角色。也许这种类型的拉动是不可能的?
  • 我确信这是可能的,但我不知道你的数据是什么样子给你一个完整的解决方案。您介意使用您正在使用的表格上的数据示例来编辑您的问题吗? (如果是敏感信息,请使用虚拟数据)。然后向我们展示您想要的输出应该是什么样子。
【解决方案2】:

试试下面:

SELECT 
    USERS.USER_NAME,
    RoleQ.FirstRole,
    (CASE WHEN RoleQ.FirstRole IS NULL THEN RoleQ.SecondRole ELSE NULL END) AS SecondRole   
FROM   SYSTEM.USERS         USERS
LEFT JOIN 
(
    SELECT 
        USER_NAME,
        MAX(CASE WHEN USER_ROLE = 'MASTER' THEN USER_ROLE ELSE NULL END) AS FirstRole,
        MAX(CASE WHEN USER_ROLE = 'ADMIN' THEN USER_ROLE ELSE NULL END) AS SecondRole
    FROM SYSTEM.USER_ROLE
    GROUP BY USER_NAME 
) AS RoleQ ON USERS.USER_NAME = RoleQ.USER_NAME

【讨论】:

  • 感谢您的帮助。不幸的是,当我尝试这样做时,我收到了系统反馈给我的错误“ORA-00905:缺少关键字”。
  • @potterwiz 您能否提供重现此错误的示例数据(以sqlfiddle.com 或任何您可以的方式)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多