【问题标题】:Dynamically setting Where condition in query在查询中动态设置 Where 条件
【发布时间】:2018-01-12 08:02:41
【问题描述】:

我正在寻找一种方法,我需要根据数据动态更改 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] 进行比较。例如,如果条件为“超过”,则 [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

谢谢, 普拉卡兹

【问题讨论】:

  • 编辑您的问题并显示您的“答案”。如果他们只是要完成您已经完成的工作,为什么还要费心去提供帮助。
  • @GordonLinoff 当然。

标签: sql sql-server dynamic where-clause


【解决方案1】:

我认为您在这里使用“动态”一词是错误的,您的意思并不是真正的动态。搜索dynamic sql 感受一下不同之处。

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

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

顺便说一句,您提到“如果条件为 'Over',则 [Amount] 应超过 [ThresholdAmount]”,但在您的代码中,您检查 Amount 是否为 'over' 或等于ThresholdAmount。我按照你的代码做了什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2015-01-30
    • 2015-11-14
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多