【问题标题】:SQL Select, sometime need 'Where' +/- 'And' sometimes need neitherSQL 选择,有时需要 'Where' +/- 'And' 有时两者都不需要
【发布时间】:2011-05-06 15:09:49
【问题描述】:

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

strSQL = 'Select * from tableA'

有时会

strSQL = 'Select * from tableA where FieldA > x'

有时会

strSQL = 'Select * from tableA where FieldB

最后有时是

strSQL = 'Select * from tableA where FieldA > x and FieldB

所以“Where”可以在 FieldA 或 FieldB 的前面。 我发现这可以使复杂的条件逻辑构造查询字符串。 我通常的“技巧”是添加一个适用于表中所有记录的“Where”子句,这样如果包含字段A 和字段B,它们之前将始终有一个“And”。 类似的东西

strSQL = 'Select * from tableA where FieldC > 0'

如果条件 1 为真

strSQL = strSQL + ' 和 FieldA > x'

结束如果

如果条件 2 为真

strSQL = strSQL + ' 和字段A

结束如果

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

【问题讨论】:

    标签: sql


    【解决方案1】:

    一个技巧是使用 1=1 作为条件...

    strSQL = 'Select * from tableA where 1=1'
    

    然后像上面那样继续。这将使 DBMS 不必实际检查 FieldC 上的任何条件(这将始终花费处理时间,即使 FieldC 始终 >0),因为 1=1 将被查询解析​​器优化。

    【讨论】:

    • 我不知道你能做到这一点。这非常适合我的需要。
    【解决方案2】:

    你可以把这样的东西分解成一个方法

    if (first)
    {
        first = false;
        return " where ";
    }
    else
    {
        return " and ";
    }
    

    并在 if 块中的实际语句之前调用该方法。

    编辑:

    或将所有内容拆分为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
    

    【讨论】:

    • Albin,这可能是一个愚蠢的问题,但是该方法如何知道它是第一次还是随后被此调用子调用
    • @jjb,它可以将first参数存储在类成员中。我假设您不是用 SQL 构建查询,而是用另一种语言构建查询。
    • 当然。抱歉,我对 OOP 不太了解,我在程序上考虑了一个静态变量,您可能首先清除它,然后在后续调用中递增。
    【解决方案3】:

    在存储过程中,我有时会使用 sql 之类的

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 2016-09-27
      • 1970-01-01
      • 2016-05-15
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多