我有一个带子句的选择查询。现在,我必须基于用户访问权限在where子句中添加其他条件。如果用户没有访问权限,则需要在where子句中包含其他条件,否则,如果用户有权访问,则没有其他逻辑。
例如:
Select * from TableA where ID > 100
其他逻辑: 如果用户无权访问管理页面,则@ X = 0;如果用户无权访问外部页面,则@Y = 0。
我需要在where子句中包含以下逻辑:
if (@X = 0 and @y=0) then
pagecode not in ('admin','external')
else if(@x=0 and @y=1) then
pagecode not in ('admin')
else if(@x=1 and @y=0) then
pagecode not in ('external')
else
no additional logic in where clause
如何在where子句中使用用例来实现。
答案 0 :(得分:2)
您可以在WHERE中使用CASE,如下所示:
WHERE 1=(
CASE WHEN @X = 0 and @y = 0 and pagecode not in ('admin','external') THEN 1
WHEN @x = 0 and @y = 1 and pagecode not in ('admin') THEN 1
WHEN @x = 1 and @y = 0 and pagecode not in ('external') THEN 1
ELSE 0 END
)
如果@ x = 1和@ y = 1,则不会返回任何行。 如果要返回所有行,如果@ x = 1和@ y = 1
WHERE 1=(
CASE WHEN @X = 0 and @y = 0 and pagecode not in ('admin','external') THEN 1
WHEN @x = 0 and @y = 1 and pagecode not in ('admin') THEN 1
WHEN @x = 1 and @y = 0 and pagecode not in ('external') THEN 1
WHEN @x = 1 and @y = 1 THEN 1
ELSE 0 END
)
答案 1 :(得分:1)
这里的细节很少。 ELSE非常模糊,但是我假设两个变量都等于1。但是我们甚至不知道那些数据类型,所以不能完全确定。我的猜测是这样的。
where
(
@X = 0
and
@y = 0
and pagecode not in ('admin','external')
)
OR
(
@x = 0
and
@y = 1
and
pagecode not in ('admin')
)
OR
(
@x = 1
and
@y = 0
and
pagecode not in ('external')
)
OR
(
@x = 1
and
@y = 1
)
被警告。这种方法可能会遇到一些严重的性能问题。盖尔·肖(Gail Shaw)撰写了有关此here和后续内容here的文章。您还可以阅读Erland Sommarskog的文章here
答案 2 :(得分:1)
也许是这样:
WHERE ID > 100
AND ((pagecode != 'admin' and X = 0) or X= 1)
AND ((pagecode != 'external' and Y = 0) or Y= 1)