我有一个构建的查询 有时会是
strSQL ='从表A'中选择*
有时会是
strSQL ='从tableA中选择*,其中FieldA> X'
有时会是
strSQL ='从表A中选择*,其中FieldB< Y'
最后有时它是
strSQL ='从tableA中选择*,其中FieldA> x和FieldB< Y'
所以'Where'可以在FieldA或FieldB前面。 我发现这可以使复杂的条件逻辑构造查询字符串。 我通常的'技巧'是放入一个'Where'子句,这对于表中的所有记录都是正确的,这样fieldA和fieldB(如果包含它们)将始终在它们之前有一个'And'。 像
这样的东西strSQL ='从tableA中选择*,其中FieldC> 0'
if condition1 true
strSQL = strSQL +'和FieldA> X'
结束
if condition2 true
strSQL = strSQL +'和FieldA< B'
结束
除了在我的代码中使用更多条件逻辑之外,还有更好的方法来实现这一目标吗?
答案 0 :(得分:4)
一个技巧是使用1 = 1作为条件......
strSQL = 'Select * from tableA where 1=1'
然后就像你已经拥有的那样继续前进。这将保存DBMS必须实际检查FieldC上的任何条件(即使FieldC总是> 0,也总是需要处理时间),因为1 = 1将由查询解析器优化。
答案 1 :(得分:1)
你可以将这样的东西分解为方法
if (first)
{
first = false;
return " where ";
}
else
{
return " and ";
}
并在if-blocks中的真实语句之前调用该方法。
修改强>
或将所有内容分解为AppendCondition
方法,该方法也会添加条件字符串。
然后你称之为
strSQL = 'Select * from tableA'
if condition1 true
strSQL = strSQL + AddCondition('FieldA > x')
end if
if condition2 true
strSQL = strSQL + AddCondition('FieldA < B')
end if
答案 2 :(得分:1)
在存储过程中,我有时会使用像
这样的sqlselect * from tableA
where (@paramX is null or fieldA > @paramX)
and (@paramY is null or fieldB < @paramY)
其中null
值表示“不检查此值”。