sql поисковый запрос для нескольких необязательных параметров - PullRequest
5 голосов
/ 02 декабря 2008

Я пытаюсь написать запрос для страницы расширенного поиска в моей системе архивирования документов. Я пытаюсь выполнить поиск по нескольким необязательным параметрам. У меня есть около 5 параметров, которые могут быть пустыми строками или поисковыми строками. Я знаю, что мне не нужно проверять каждую строку как пустую или пустую и создавать отдельную хранимую процедуру для каждой комбинации.

Edit: Завершено использованием:

ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '')

Ответы [ 6 ]

8 голосов
/ 02 декабря 2008

Вы можете использовать COALESCE (или ISNULL) следующим образом:

WHERE COALESCE(@var1, col1) = col1 
AND COALESCE(@var2, col2) = col2 
AND COALESCE(@var3, col3) = col3
6 голосов
/ 02 декабря 2008

Я обычно так делаю: P

WHERE (@var1 IS NULL OR col1 = @var1)
AND (@var2 IS NULL OR col2 = @var2)

...

1 голос
/ 02 декабря 2008

Альтернативой является динамическое построение SQL в хранимой процедуре, при этом создается наилучший возможный план для запроса, и план будет создан и использован в любом случае (в 2005 году и выше).

1 голос
/ 02 декабря 2008

Вы можете поместить ИЛИ в предложение WHERE следующим образом:

WHERE 
   (@var1 = '' OR col1 = @var1) AND
   (@var2 = '' OR col1 = @var2) AND
   (@var3 = '' OR col1 = @var3) ...
0 голосов
/ 02 декабря 2008

Еще лучше сделать параметр необязательным NULL, а затем выполнить проверку в предложении WHERE, как в случае с пустой строкой ...

0 голосов
/ 02 декабря 2008

Вы можете передать необязательные параметры хранимой процедуре, но оптимизатор создаст план, основываясь на конкретных вызовах, которые вы делаете этому процессу. В SQL Server 2005 и более поздних версиях есть некоторые приемы, позволяющие избежать этого (сниффинг параметров, подсказки «без компиляции» и т. Д.)

Несмотря на это, я предпочитаю создавать представление с ядром запроса, а затем использовать это представление в нескольких процессах с конкретными параметрами. Это позволяет SQL оптимизировать так, как он хочет / должен, и я все еще могу консолидировать особенности запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...