带条件且不处于条件的SQL Where子句

时间:2018-09-13 15:11:08

标签: sql-server

我有一个带子句的选择查询。现在,我必须基于用户访问权限在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子句中使用用例来实现。

3 个答案:

答案 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)