【发布时间】: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