Как игнорировать некоторые параметры в 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

Я попробовал ниже synctax, но не удалось

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

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

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;

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

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

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

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, он выяснит, стоит ли проверять 1-й параметр или нет.

Другие вопросы по тегам