Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите грамотно составить запрос  [new]
foosh
Member

Откуда:
Сообщений: 188
Корифеи, помогите советом, плиз.

Есть хранимая процедура с тремя параметрами, в которой должен выполняться запрос такого типа:

	SELECT * 
	FROM з_Расчеты_сумма
	WHERE Дата BETWEEN (@Начальная_дата) AND (@Конечная_дата) AND Клиент = @Клиент


Проблема в чем. Передаваемые параметры в определенных случаях могут иметь значение NULL.

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

Как лучше это реализовать? Через IF ELSE? Или есть другие способы?
2 мар 13, 18:10    [14003451]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
ISNULL
2 мар 13, 18:14    [14003457]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
foosh
Member

Откуда:
Сообщений: 188
Cygapb-007,
Прошу сказать немного больше, потому что я, по всей видимости, недопонял. В моем понимании, если просто использовать ISNULL, то запрос тогда не вернет никаких значений. А мне нужно с точностью до наоборот - если параметр неопределен, чтобы запрос возвращал все значения. То есть, если клиент неопределен, чтобы запрос возвращал записи для всех клиентов. Если даты неопределены - чтобы возвращались записи за все время существования базы.
2 мар 13, 18:37    [14003489]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
SELECT * 
	FROM з_Расчеты_сумма
	WHERE Дата BETWEEN ISNULL(@Начальная_дата,0) AND ISNULL(@Конечная_дата,GETDATE()) AND Клиент = ISNULL(@Клиент,Клиент)
2 мар 13, 18:53    [14003529]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
serpentariy
Member

Откуда:
Сообщений: 265
SELECT * 
FROM з_Расчеты_сумма
WHERE (Дата BETWEEN (@Начальная_дата) AND (@Конечная_дата) OR Дата>=@Начальная_дата AND @Конечная_дата IS NULL
           OR @Начальная_дата IS NULL AND @Конечная_дата IS NULL) AND (Клиент = @Клиент OR @Клиент IS NULL)
foosh,
2 мар 13, 18:57    [14003542]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
              SELECT * 
              FROM з_Расчеты_сумма
              WHERE Дата BETWEEN (@Начальная_дата)
                                   AND ISNULL(@Конечная_дата,getdate())
                    AND CASE 
                          WHEN @КлиентКлиент = null THEN TRUE
                          ELSE Клиент = @Клиент
                        END
2 мар 13, 19:01    [14003561]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
foosh
Member

Откуда:
Сообщений: 188
Благодарю всех за помощь...
2 мар 13, 23:56    [14004412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8823
MiCe
              SELECT * 
              FROM з_Расчеты_сумма
              WHERE Дата BETWEEN (@Начальная_дата)
                                   AND ISNULL(@Конечная_дата,getdate())
                    AND CASE 
                          WHEN @КлиентКлиент = null THEN TRUE
                          ELSE Клиент = @Клиент
                        END


....невзлетит.... (@КлиентКлиент = null для MSSQL непрёт)
3 мар 13, 04:07    [14004794]     Ответить | Цитировать Сообщить модератору
 Re: Помогите грамотно составить запрос  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
должно быть, музыка навеяла...
AND isnull(Клиент,'') like isnull(nullif(@Клиент,''),'%')
3 мар 13, 11:18    [14004986]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить