SQL选择,有时需要'Where'+/-'而''有时不需要

时间:2010-11-08 11:56:03

标签: sql

我有一个构建的查询 有时会是

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'

结束

除了在我的代码中使用更多条件逻辑之外,还有更好的方法来实现这一目标吗?

3 个答案:

答案 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)

在存储过程中,我有时会使用像

这样的sql
select * from tableA 
where (@paramX is null or fieldA > @paramX)
and (@paramY is null or fieldB < @paramY)

其中null值表示“不检查此值”。