寻求比在SELECT语句中使用嵌套IF ... ELSE更低成本的设计

时间:2015-08-12 18:18:05

标签: sql sql-server sql-server-2008

我允许用户在视图中使用3个下拉列表创建自己的SELECT语句。这些下拉列表将在WHERE子句中生成SQL。例如:WHERE StatusId > 6。中间下拉列表用于选择运算符,其中有6个选项:=, >, >=, <, <=, LIKE。我试图避免动态SQL以防止注入。

所以这是用户进行选择时调用的SQL代码(在SP中):

    If @topOperatorInput  = '=' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput = @topRightInput;
  End
  Else If @topOperatorInput  = '>' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput > @topRightInput;
  End
  Else If @topOperatorInput  = '>=' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput >= @topRightInput;
 End
  Else If @selectedColumns  = '<' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput < @topRightInput;
  End
  Else If @topOperatorInput  = '<=' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput <= @topRightInput;
  End
  Else If @topOperatorInput  = 'LIKE' 
  Begin
    Select @selectedColumns
    from ReturnAuthorization
    where @topLeftInput LIKE @topRightInput;
  End

您在此处看到的所有变量都是来自MVC控制器的输入变量(用户选择)。

这里的事情对我来说有点棘手。用户可以选择AND选项,他们可以在页面中添加3个下拉菜单以供选择。

例如:WHERE StatusId > 6 AND UserId = 2

现在,新的运算符下拉列表在混合中添加了另外6个选项。为了适应,如果我保留这种当前格式,我将不得不在上面显示的6个选项中的每一个中嵌套6个IF ... ELSE IF。

任何以较便宜的方式执行此操作的解决方案都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

使用开关盒,以便检查所需的唯一条件并交换所有其他条件而不检查