2013-07-25 1 views
3

Если у меня есть SQL заявление, как показано нижеКак игнорировать некоторые параметры в TQuery

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

И обычно я использую TQuery, чтобы получить некоторые данные, как показано ниже

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

Но как я могу игнорировать " ИДС»ключ, чтобы получить SQL как

SELECT * FROM myTable WHERE DataType = :vDataType 

Я стараюсь ниже synctax, но не

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) 

Второй будет обрабатывать случай NULL значений в таблице тоже.

Параметр, который вы не хотите использовать может быть установлен в Unassigned

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

С: VCID является NULL он будет оценен как CID = CID

+0

, которые должны потерпеть неудачу, если поле CID на самом деле NULL –

+0

@ Arioch'The спасибо за подсказку, я сделал редактирование относительно этого случая. – 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 Optimizer, то цифра будет вне когда первый параметр стоит проверить или нет.

 Смежные вопросы

  • Нет связанных вопросов^_^