【问题标题】:How do I add a boolean column to an SQL result set based on comparison with a second table如何根据与第二个表的比较将布尔列添加到 SQL 结果集中
【发布时间】:2011-09-27 01:03:38
【问题描述】:

基本上我已经回答了问题的第一部分,这是我到目前为止的 SQL 语句......

SELECT DbaRolePrivs.GRANTEE,
       DbaRolePrivs.GRANTED_ROLE,
       ApplicationRoleDefinition.ROLE,
       ApplicationRoledefinition.description_tx, 
       CASE
         WHEN GRANTED_ROLE = ROLE AND GRANTEE = USERNAME THEN
           'T'
         ELSE
           'F'
       END AS checkMark
FROM DBA_ROLE_PRIVS DbaRolePrivs, APPLICATION_ROLE_DEFINITION ApplicationRoleDefinition

这是我试图用简单的英语执行的逻辑。

“给定所有角色及其描述的列表,根据当前选定的 USERNAME 是否已根据他们自己的 GrantedRoles 列表授予该角色,将每个角色标记为 TRUE 或 FALSE。”

现在它当然会返回一个双重列表,因为“case when”部分将每个授予的角色与角色的总列表进行比较。 (我说重复是因为测试用户只有两个角色,在当前的 SQL 查询中,它会为每个可能的角色为每个授予的角色返回一行。

我几乎没有使用过 SQL,所以我更习惯于 C++、Objective-C 等。在“case when”部分中,我真正需要的只是检查 GRANTED_ROLE 列中是否存在当前 ROLE .我见过 EXISTS 函数,但这似乎仅适用于结果集,例如“WHERE EXISTS”。

提前谢谢,我知道对于经常使用数据库的人来说这可能很简单,我才刚刚开始。

【问题讨论】:

  • 'T''F' 并不是真正的布尔值...
  • @Matt Ball:它们和标准 SQL-92 中的一样好。可以说 SQL-99 的 BOOLEAN 类型也不是真正的布尔值:使用 SQL 的三值逻辑,所有的赌注都没有了。

标签: sql oracle boolean jdeveloper


【解决方案1】:

你需要outer join,然后测试join是否成功。如果外连接失败,仍会返回一行,但所有 DbaRolePrivs 列将为空

SELECT  DbaRolePrivs.GRANTEE,
        DbaRolePrivs.GRANTED_ROLE,
        ApplicationRoleDefinition.ROLE,
        ApplicationRoledefinition.description_tx,
        NVL2( DbaRolePrivs.GRANTED_ROLE, 'T', 'F' ) AS checkMark
FROM    DBA_ROLE_PRIVS DbaRolePrivs
    ,   APPLICATION_ROLE_DEFINITION ApplicationRoleDefinition
WHERE   ApplicationRoleDefinition.ROLE = DbaRolePrivs.GRANTED_ROLE (+)
AND     USERNAME                       = DbaRolePrivs.GRANTEE      (+)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多