如何忽略TQuery中的一些参数

Leo*_*o.W 3 delphi sql-server-2000 tquery bde delphi-5

如果我有一个如下所示的SQL语句

SELECT * FROM myTable WHERE CID = :vCID AND DataType = :vDataType
Run Code Online (Sandbox Code Playgroud)

通常我使用TQuery来获取如下的数据

aQuery.ParamByName('vCID').Value := '0025';
aQuery.ParamByName('vDataType').AsInteger := 1;
Run Code Online (Sandbox Code Playgroud)

但是我怎么能忽略"CID"键才能得到类似SQL的东西

SELECT * FROM myTable WHERE DataType = :vDataType
Run Code Online (Sandbox Code Playgroud)

我尝试了下面的synctax,但失败了

aQuery.ParamByName('vCID').Value := '%';
aQuery.ParamByName('vDataType').AsInteger := 1;
Run Code Online (Sandbox Code Playgroud)

请帮帮我,谢谢.

bum*_*mmi 8

将您的查询更改为

SELECT * FROM myTable 
WHERE CID = ISNULL(:vCID,CID) AND DataType = ISNULL(:vDataType,DataType)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM myTable 
WHERE COALESCE(CID,'') = COALESCE(:vCID,CID,'') 
  AND COALESCE(DataType,0) = COALESCE(:vDataType,DataType,0)
Run Code Online (Sandbox Code Playgroud)

第二个也将处理表中NULL值的情况.

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

aQuery.ParamByName('vCID').Value := Unassigned; // <<
aQuery.ParamByName('vDataType').AsInteger := 1;
Run Code Online (Sandbox Code Playgroud)

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

  • "第二个将处理NULL值的情况" - 但是以CID上的索引搜索禁用为代价 - 仅自然扫描 (2认同)

Rem*_*eau 5

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

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

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