sql - CASE WHEN 选择要带回 ORACLE SQL 的值列表
问题描述
我正在尝试使用一个案例来强制执行一些不标准的数据访问安全性。
我正在尝试做的基础知识不断导致“多行”错误。
在确定将返回哪个列表时,我想对案例结果使用 2 个不同的子查询。
示例逻辑
SELECT CASE
WHEN condition 1 is true THEN (SUBQUERY 1)
WHEN condition 2 is true THEN (SUBQUERY 2)
END AS ACCESS
FROM DUAL
那里的两个子查询都可以正常工作并取回正确的值,将它们放入上面的括号中,但它会失败。
子查询 1
SELECT DISTINCT FND.PK1_START_VALUE
FROM FND_GRANTS FG
JOIN FND_OBJECTS_VL FO
ON FO.OBJECT_ID = FG.OBJECT_ID
JOIN FND_FORM_FUNCTIONS_VL FFF
ON FO.OBJECT_ID = FFF.OBJECT_ID
JOIN FND_MENU_ENTRIES FME
ON FME.MENU_ID = FG.MENU_ID AND FFF.FUNCTION_ID = FME.FUNCTION_ID
LEFT JOIN FND_OBJECT_INSTANCE_SETS_VL FOIS
ON FG.INSTANCE_SET_ID = FOIS.INSTANCE_SET_ID
JOIN FND_SESSION_ROLES FSR
ON FG.ROLE_NAME = FSR.ROLE_NAME
JOIN FND_SESSIONS FS
ON FS.SESSION_ID = FSR.SESSION_ID
LEFT JOIN FND_FLEX_VALUES_VL FLV
ON FLV.DESCRIPTION = SUBSTR(FG.NAME, 1, CASE WHEN INSTR(FG.NAME,'Area')< 1 THEN INSTR(FG.NAME,'Cost')-2)
ELSE (INSTR(FG.NAME,'Area')-2)
END)
JOIN FND_TREE_NODE FND
ON FLV.FLEX_VALUE = FND.PARENT_PK1_VALUE
WHERE FG.ROLE_NAME IN (:P_ROLE)----:P_ROLE is a list of VALUES fetching back the users system access.
AND FND.TREE_STRUCTURE_CODE = 'GL_ACCT_FLEX'
AND FND.TREE_CODE ='Cost Centre-T'
AND FND.DEPTH ='4'
ORDER BY FND.PK1_START_VALUE ASC)
SUBQUERY 2----这里的想法是用户在 P_ROLE 中没有任何角色,因此可以访问所有部分
SELECT DISTINCT FND.PK1_START_VALUE
FROM FND_TREE_NODE FND
WHERE FND.TREE_STRUCTURE_CODE IN('GL_ACCT_FLEX')
AND FND.TREE_CODE IN('Cost Centre-T')
AND FND.DEPTH IN('4')
注意一些敏感数据已从查询中删除并替换
解决方案
嗯。. . 我想你想要union all
:
SELECT q1.*
FROM (SUBQUERY 1) q1
WHERE condition1
UNION ALL
SELECT q2.*
FROM (SUBQUERY 2) q1
WHERE (NOT condition 1) AND -- may not be necessary
(condition 2) is true ;
注意:这假设每个子查询返回的列是兼容的——在数量和类型上。结果集中的名称取自第一个子查询。
推荐阅读
- c# - RabbitMQ 和重复数据删除插件的问题
- c - 这些 fork() 调用创建了多少个进程?
- vert.x - 无法理解 vert.x 配置加载
- jenkins-pipeline - 如何编写包含并行作业中的顺序作业的动态声明性管道
- javascript - 方法调用后状态数组被清空
- python - 使用 OpenCV 将 RGB 图像转换为 LMS,反之亦然
- memory - 在 Julia 中提取和收集生成器的随机子样本的有效方法
- docker - 在 Windows 10 上的 Laradock Docker 上启动工作区时出现权限错误
- spring - Spring boot MongoDb complex query
- android - 使用 proguard 时 Google 地方信息显示错误