【发布时间】:2017-02-12 19:52:07
【问题描述】:
我在 SQL 中有一个安全表,2 列是有价值的,这些列可以指示以下任何信息,每个用户可能存在选项 L 或 D 的多个条目,值列中的值,如果 L或 D 表示用户有权访问或不访问的仓库列表,类似 All 表示用户有权访问所有仓库,None 表示没有仓库访问权限。
Option | Value
---------------
A | All
N | None
L | xyz (Allowed value)
D | xyz (Denied Value)
我的问题是 SQL 中的 WHERE 子句,我需要为所有 4 个场景提供配置,到目前为止,我只能为 4 个场景中的 3 个提供配置,看看我的最后一个子句,我需要在 IN 和 NOT 之间切换IN 取决于选项。
WHERE
(CASE WHEN (SELECT TOP(1) Value FROM [AllowDisallowNone] ('demo1', 'ARBranches')) = 'All'
THEN 'All' END != Branch
OR
CASE WHEN (SELECT TOP(1) Value FROM [AllowDisallowNone] ('demo1', 'ARBranches')) = 'None'
THEN 'None' END = Branch
OR
Branch IN (SELECT Value FROM [AllowDisallowNone] ('demo1', 'ARBranches')))
关于如何更有效地做到这一点,有什么建议吗?
关于这两个表的更多细节:
安全表如下所示:
SELECT [Operator]
,[Type]
,[TypeOption]
,[Value]
FROM [_OperatorAccess]
WHERE [Type] = 'ARBranches'
安全表数据:
请记住,类似于TypeOption = A 的允许分支列表,可能有TypeOption = D 的用户用于拒绝分支列表。
我需要过滤我的分支表查询以仅显示用户有权访问的分支。如果我把它分成 4 个单独的查询,它会是这样的:
For TypeOption = A (All Records)
Select Invoice, Branch, InvDate FROM Branches (No Where Clause necessary, because user have access to all Branches)
For TypeOption = N (No Records)
Select Invoice, Branch, InvDate FROM Branches WHERE Branch = '' (No Branches will be returned, becuase my Branch field cannot be null or empty.)
For TypeOption = L (List of allowed branches)
Select Invoice, Branch, InvDate FROM Branches WHERE Branch IN (Select Value FROM _OperatorAccess WHERE Operator = 'RWOL' AND Type = 'ARBranches')
For TypeOption = D (List of denied branches)
Select Invoice, Branch, InvDate FROM Branches WHERE Branch NOT IN (Select Value FROM _OperatorAccess WHERE Operator = 'RWOL' AND Type = 'ARBranches')
我确实希望这更有意义。
【问题讨论】:
-
您能否发布完整的查询文本,包括 SELECT 块?
-
能否提供更多详细信息,例如安全表的名称、架构和示例数据、“AllowDisallowNone”函数的代码(不是函数吗?)以及预期的案例查询结果?