在查询中动态设置 Where 条件
Dynamically setting Where condition in query
我正在寻找一种方法,我需要根据数据动态更改 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
谢谢,
普拉卡兹
我认为您在这里使用 "Dynamically" 这个词是错误的,您的意思不是真正的动态。搜索 dynamic sql
以感受差异。
通常最好避免在 where
子句中使用 case 表达式。您的 where
子句可以重写为:
WHERE (ConditionName = 'OVER' AND [Amount] >= [ThresholdAmount])
OR (ConditionName = 'UNDER' AND [Amount] <= [ThresholdAmount])
OR ConditionName = 'N/A'
顺便说一下,你提到了 "if the condition is 'Over' then the [Amount] should be over the [ThresholdAmount]",但在你的代码中你检查 Amount
是否是 'over' 或等于 到 ThresholdAmount
。我按照你的代码做了什么。
我还扩展了您对数据库不区分大小写的假设。
我正在寻找一种方法,我需要根据数据动态更改 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
谢谢, 普拉卡兹
我认为您在这里使用 "Dynamically" 这个词是错误的,您的意思不是真正的动态。搜索 dynamic sql
以感受差异。
通常最好避免在 where
子句中使用 case 表达式。您的 where
子句可以重写为:
WHERE (ConditionName = 'OVER' AND [Amount] >= [ThresholdAmount])
OR (ConditionName = 'UNDER' AND [Amount] <= [ThresholdAmount])
OR ConditionName = 'N/A'
顺便说一下,你提到了 "if the condition is 'Over' then the [Amount] should be over the [ThresholdAmount]",但在你的代码中你检查 Amount
是否是 'over' 或等于 到 ThresholdAmount
。我按照你的代码做了什么。
我还扩展了您对数据库不区分大小写的假设。