首页 > 解决方案 > 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')

注意一些敏感数据已从查询中删除并替换

标签: sqloracle

解决方案


嗯。. . 我想你想要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 ;

注意:这假设每个子查询返回的列是兼容的——在数量和类型上。结果集中的名称取自第一个子查询。


推荐阅读