3

如果我有如下 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;

请帮帮我,谢谢。

4

3 回答 3

8

将您的查询更改为

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

于 2013-07-25T15:59:56.707 回答
5

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

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;
于 2013-07-25T19:00:21.600 回答
2

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

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 优化器,那么它会判断第一个参数何时值得检查。

于 2013-07-25T16:11:13.803 回答