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