我正在寻找一种方法,我需要根据数据动态更改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
答案 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
。我按照你的代码做了。
我还扩展了您对数据库不区分大小写的假设。