SQL - Условное предложение WHERE - PullRequest
4 голосов
/ 25 февраля 2010

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

@ StateID как int,
@CountyID как int,
@CityID как int

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

SELECT
  *
FROM
  Customer c
WHERE
 c.StateID=@StateID 
 -- AND c.CountyID=@CountyID IF @CountyID IS NOT NULL
 -- AND c.CityID=@CityID IF @CityID IS NOT NULL

Ответы [ 7 ]

12 голосов
/ 25 февраля 2010

Соедините те с некоторыми операторами ИЛИ:

SELECT *
FROM
    Customer c
WHERE
    c.StateID=@StateID
    AND ( c.CountyID=@CountyID OR @CountyID IS NULL )
    AND ( c.CityID=@CityID OR @CityID IS NULL )

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

3 голосов
/ 25 февраля 2010
 c.StateID=@StateID 
 AND
 c.CountyID = ISNULL(@CountyID, c.CountyID)
 ...

Использовать операторы IF

или

 c.StateID=@StateID 
 AND
 @CountyID IS NULL OR c.CountyID = @CountyID)
 ....

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

Или ищите ТАК для всех остальных вопросов, задающих тот же ...

3 голосов
/ 25 февраля 2010
SELECT * 
FROM Customer c 
WHERE c.StateID=@StateID 
AND c.CountyID= ISNULL(@CountyID, c.CountyID) 
AND c.CityID = ISNULL(@CityID, c.CityID)
1 голос
/ 25 февраля 2010

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

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

1 голос
/ 25 февраля 2010
 SELECT * FROM Customer c WHERE (c.StateID=@StateID) AND ((c.CountyID=@CountyID) OR (@CountyID IS NULL)) AND ((c.CityID=@CityID) OR (@CityID IS NULL))
0 голосов
/ 25 февраля 2010

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

SELECT *
FROM Customer c
WHERE
 c.StateID=@StateID 
 AND c.CountyID = COALESCE(@CountyID, c.CountyID)
 AND c.CityID = COALESCE(@CityID, c.CityID)

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

0 голосов
/ 25 февраля 2010

В одну сторону:

SELECT * 
FROM Customer c 
WHERE c.StateID=@StateID 
    AND (@CountyID IS NULL OR c.CountyID=@CountyID)
    AND (@CityID IS NULL OR c.CityID=@CityID)

Другой способ:

SELECT * 
FROM Customer c 
WHERE c.StateID=@StateID 
    AND c.CountyID=ISNULL(@CountyID, c.CountyID)
    AND c.CityID=ISNULL(@CityID, c.CityId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...