2013-07-25 98 views
3

,如果我有这样一个SQL语句下面如何忽略某些参数的TQuery

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

,通常我使用的TQuery得到像下面

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

但我怎么能忽略一些数据“ CID”键得到像

SELECT * FROM myTable WHERE DataType = :vDataType 

我已经尝试下面的synctax一个SQL,但是失败

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

请帮帮我,谢谢。

+0

@ Arioch'The,我使用Delphi5与SQL Server 2000中 –

+2

,应该在问题标签或至少在正文中,不要埋在评论 –

回答

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; 
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) 

第二个会处理空值的情况下,在表过。

你不想使用可以设置为Unassigned

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

由于参数:VCID是NULL作为CID = CID

+0

那应该失败,如果CID字段实际上是NULL –

+0

@ Arioch'谢谢你的提示,我做了一个关于这种情况的编辑。 – bummi

+2

“第二个将处理NULL值的情况” - 但是以禁用CID索引搜索的代价 - 只有自然扫描 –

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优化器,那么它会找出当第一个参数是值得一试与否。