如果我有如下的SQL语句
SELECT * FROM myTable WHERE CID = :vCID AND DataType = :vDataType
通常我使用TQuery来获取如下所示的数据
aQuery.ParamByName('vCID').Value := '0025';
aQuery.ParamByName('vDataType').AsInteger := 1;
但是如何忽略“CID”键来获得类似
的SQLSELECT * FROM myTable WHERE DataType = :vDataType
我尝试了下面的synctax,但失败了
aQuery.ParamByName('vCID').Value := '%';
aQuery.ParamByName('vDataType').AsInteger := 1;
请帮帮我,谢谢。
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分: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 Optimizer,那么它会判断第一个参数是否值得检查。