2010-02-24 3 views
4

У меня есть хранимая процедура SQL Server 2005, которая выполняет запрос. Эта хранимая процедура принимает три параметра. Параметры заключаются в следующем:SQL - условное предложение WHERE

@StateID как INT,
@CountyID как INT,
@CityID как INT

Эти параметры используются для запроса списка клиентов. Я хочу в основном сделать «И», если значение параметра не равно нулю. Тем не менее, я не могу сделать if-else в это время. Как добавить эти предложения, если значение параметра не равно нулю. Другими словами:

SELECT 
    * 
FROM 
    Customer c 
WHERE 
[email protected] 
-- AND [email protected] IF @CountyID IS NOT NULL 
-- AND [email protected] IF @CityID IS NOT NULL 

ответ

12

Пара те или некоторые заявления:

SELECT * 
FROM 
    Customer c 
WHERE 
    [email protected] 
    AND ([email protected] OR @CountyID IS NULL) 
    AND ([email protected] OR @CityID IS NULL) 

Для каждого из этих параметров, если она равна нулю, то проверка в основном игнорируется.

+2

Это будет плохо работать из-за способности к переносу. См. Ответ gbn на альтернативы для рассмотрения. –

+0

OMG Ponies - это то, что у Aaron есть NULL чеки * после * ORs? – stack

+0

Ответ Аарона, в отличие от gbn's, имеет то преимущество, что даже если столбец CountyID может содержать значения NULL. Мне нужна была аналогичная функциональность, как в этом вопросе, но в моей колонке были некоторые значения NULL; этот работал для меня. –

3
SELECT * 
FROM Customer c 
WHERE [email protected] 
AND c.CountyID= ISNULL(@CountyID, c.CountyID) 
AND c.CityID = ISNULL(@CityID, c.CityID) 
3
[email protected] 
AND 
c.CountyID = ISNULL(@CountyID, c.CountyID) 
... 

Использование IF заявления

Или

[email protected] 
AND 
@CountyID IS NULL OR c.CountyID = @CountyID) 
.... 

Или динамический SQL

Или поиск SO для все остального вопроса задает то же ...

1

нет «правильного пути», это зависит от многих факторов, здесь большая статья, описывающие плюсы и минусы каждого способа есть динамические условия поиска:

http://www.sommarskog.se/dyn-search.html

0

Попробуйте с COALESCE, я думаю, что это очень элегантный, чистый подход:

SELECT * 
FROM Customer c 
WHERE 
[email protected] 
AND c.CountyID = COALESCE(@CountyID, c.CountyID) 
AND c.CityID = COALESCE(@CityID, c.CityID) 

(Имейте в виду, что - это отфильтрует записи с нулями в CountyID или CityID.)

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