Как игнорировать некоторые параметры в TQuery

Если у меня есть оператор 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;

Пожалуйста, помогите мне, спасибо.


person Leo.W    schedule 25.07.2013    source источник
comment
@Arioch'The, я использую Delphi5 и SQL Server 2000   -  person Leo.W    schedule 25.07.2013
comment
это должно быть в тегах вопроса или хотя бы в теле, а не в комментариях   -  person Arioch 'The    schedule 25.07.2013


Ответы (3)


Лучший вариант — просто использовать отдельные запросы:

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;
person Remy Lebeau    schedule 25.07.2013

Измените свой запрос на

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

or

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.

person bummi    schedule 25.07.2013
comment
это должно завершиться ошибкой, если поле CID на самом деле равно NULL - person Arioch 'The; 25.07.2013
comment
@Arioch'Спасибо за подсказку, я отредактировал этот случай. - person bummi; 25.07.2013
comment
Второй будет обрабатывать случай значений NULL - но ценой отключения индексированного поиска по CID - только естественное сканирование - person Arioch 'The; 25.07.2013

Обычный, но несколько многословный способ — ввести еще один параметр.

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;

or

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

Если на сервере есть приличный SQL Optimizer, то он поймет, стоит ли проверять 1-й параметр или нет.

person Arioch 'The    schedule 25.07.2013