动态设置查询中的Where条件

时间:2017-08-04 11:36:58

标签: sql sql-server dynamic where-clause

我正在寻找一种方法,我需要根据数据动态更改WHERE子句的条件。

请查找我的方案的模拟数据。

 -----------------------------------
  ConditionID        ConditionName
 -----------------------------------
  1                  N/A
  2                  Over
  3                  Under

  --------------------------------------------------------------
   ID        Amount        ThresholdAmount        ConditionID
  --------------------------------------------------------------
   1         90            100                    3
   2         190           100                    2
   3         90            100                    2
   4         190           100                    3
   5         90            100                    1

我需要根据[ConditionID]将[Amount]与[ThresholdAmount]进行比较。例如,如果条件为“Over”,那么[Amount]应该超过[ThresholdAmount],如果不满足则应该过滤掉记录。

注意:我只是在寻找是否有比我更好的方法。

我的方法:

WHERE
    1 =   CASE 
            WHEN ConditionName = 'OVER' THEN
                CASE WHEN ([Amount] >= [ThresholdAmount]) THEN 1 ELSE 0 END
            WHEN ConditionName = 'UNDER' THEN 
                CASE WHEN ([Amount] <= [ThresholdAmount]) THEN 1 ELSE 0 END
            WHEN ConditionName =  'N/A' THEN
                1
          END

谢谢, Prakazz

1 个答案:

答案 0 :(得分:4)

我认为你在这里使用“动态”这个词是错误的,你的意思并不是真正的动态。搜索dynamic sql以了解差异。

通常最好避免使用where子句中的case表达式。您的where子句可以重写为:

WHERE       (ConditionName = 'OVER' AND [Amount] >= [ThresholdAmount])
        OR  (ConditionName = 'UNDER' AND [Amount] <= [ThresholdAmount])
        OR  ConditionName =  'N/A'

顺便说一句,你提到“如果条件是'结束',那么[金额]应该超过[ThresholdAmount]”,但是在你的代码中你检查Amount是否“超过”或等于ThresholdAmount。我按照你的代码做了。

我还扩展了您对数据库不区分大小写的假设。