【问题标题】:How to ignore some parameters in TQuery如何忽略 TQuery 中的某些参数
【发布时间】:2013-07-25 15:46:27
【问题描述】:

如果我有如下 SQL 语句

SELECT * FROM myTable WHERE CID = :vCID AND DataType = :vDataType

通常我使用 TQuery 来获取一些数据,如下所示

aQuery.ParamByName('vCID').Value := '0025';
aQuery.ParamByName('vDataType').AsInteger := 1;

但是我怎样才能忽略“CID”键来获得类似的 SQL

SELECT * FROM myTable WHERE DataType = :vDataType

我尝试了以下同步税,但失败了

aQuery.ParamByName('vCID').Value := '%';
aQuery.ParamByName('vDataType').AsInteger := 1;

请帮帮我,谢谢。

【问题讨论】:

  • @Arioch'The,我使用的是 Delphi5 & SQL Server 2000
  • 应该在问题标签中或至少在正文中,而不是埋在 cmets 中

标签: delphi sql-server-2000 delphi-5 bde tquery


【解决方案1】:

将您的查询更改为

SELECT * FROM myTable 
WHERE CID = ISNULL(:vCID,CID) AND DataType = ISNULL(:vDataType,DataType)

SELECT * FROM myTable 
WHERE COALESCE(CID,'') = COALESCE(:vCID,CID,'') 
  AND COALESCE(DataType,0) = COALESCE(:vDataType,DataType,0)

第二个也可以处理表中 NULL 值的情况。

不想使用的参数可以设置为Unassigned

aQuery.ParamByName('vCID').Value := Unassigned; // <<
aQuery.ParamByName('vDataType').AsInteger := 1;

由于 :vCid 为 NULL,它将被评估为 CID = CID

【讨论】:

  • 如果 CID 字段实际上是 NULL 应该会失败
  • @Arioch'感谢您的提示,我对这个案例进行了编辑。
  • “第二个将处理 NULL 值的情况” - 但代价是禁用 CID 上的索引搜索 - 仅自然扫描
【解决方案2】:

最好的选择是简单地使用单独的查询:

aQueryBoth.SQL.Text := 'SELECT * FROM myTable WHERE CID = :vCID AND DataType = :vDataType';
...
aQueryBoth.ParamByName('vCID').Value := '0025';
aQueryBoth.ParamByName('vDataType').AsInteger := 1;

aQueryDataType.SQL.Text := 'SELECT * FROM myTable WHERE DataType = :vDataType';
...
aQueryDataType.ParamByName('vDataType').AsInteger := 1;

【讨论】:

    【解决方案3】:

    通常但有些冗长的方法是引入另一个参数。

    SELECT * FROM myTable 
       WHERE ( ( CID = :vCID ) OR ( :IgnoreCID <> 0 )) 
         AND ( DataType = :vDataType )
    

    然后把你的查询变成

    aQuery.ParamByName('vCID').Value := '0025';
    aQuery.ParamByName('IgnoreCID').AsInteger := 0;
    aQuery.ParamByName('vDataType').AsInteger := 1;
    

    aQuery.ParamByName('vCID').Value := Unassigned;
    aQuery.ParamByName('IgnoreCID').AsInteger := 1;
    aQuery.ParamByName('vDataType').AsInteger := 1;
    

    如果服务器有不错的 SQL 优化器,那么它会判断第一个参数何时值得检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多