Как вернуть все записи, если параметр пуст - PullRequest
6 голосов
/ 26 мая 2011

Вот мой SP :

Alter PROCEDURE GetList 
(

@FromDate date = null,
@ToDate date = null

)
AS

Select * FROM CallList c
Where c.CallDate > @FromDate and c.CallDate < @ToDate 

Если бы не было пропущенного фильтра даты, я хочу получить все записи.

Как бы я поступилЭто?

Ответы [ 7 ]

14 голосов
/ 26 мая 2011

Вы можете сделать это:

SELECT * FROM CallList c
WHERE (c.CallDate > @FromDate OR @FromDate IS NULL) AND 
      (c.CallDate < @ToDate OR @ToDate IS NULL)

Это также оставляет вас открытым для возможности оставить одну из дат нулевой, а не другую.

6 голосов
/ 26 мая 2011

вы бы сделали следующее

SELECT * 
FROM CallList AS C
WHERE (@FromDate IS NULL OR c.CallDate > @FromDate)
AND (@ToDate IS NULL OR c.CallDate < @ToDate)
3 голосов
/ 26 мая 2011

Пара жизнеспособных вариантов:

Вы можете установить @FromDate и @ToDate равными очень ранней или очень поздней дате, соответственно они равны NULL.

Вы можете использовать sp_executesql и создать динамическую строку запроса с параметрами по мере необходимости, например,

DECLARE @Sql NVARCHAR(MAX) = 'SELECT * FROM CallList C WHERE 1 = 1 '

IF @FromDate IS NOT NULL
BEGIN
  SET @Sql += ' AND C.CallDate > @xFromDate'
END

IF @ToDate IS NOT NULL
BEGIN
  SET @Sql += ' AND C.CallDate < @xToDate'
END

EXEC sp_executesql @Sql, N'@xFromDate DATETIME, @xToDate DATETIME', @xFromDate = @FromDate, @xToDate = @ToDate

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

2 голосов
/ 12 сентября 2011

Динамический sql каждый раз выполняется, поэтому не используйте динамический sql

    select * from calllist As c
    where (c.CallDate < @ToDate or @ToDate is null)
and  (c.CallDate > @FromDate or @FromDate is null)
2 голосов
/ 26 мая 2011

Попробуйте следующее:

SELECT
    *
FROM
    CallList c
WHERE
    ( @FromDate is null AND @ToDate is null ) OR
    ( @FromDate is null AND c.CallDate < @ToDate ) OR
    ( @ToDate is null AND c.CallDate > @FromDate) OR
    ( c.CallDate > @FromDate AND c.CallDate < @ToDate )

Кроме того, если вы искали пересечение между двумя периодами, не забудьте выбрать более позднюю FromDate и более раннюю ToDate .

0 голосов
/ 03 апреля 2018

Вы также можете использовать BETWEEN (короткая рука для меньше или равно и больше или равно):

declare @ToDate varchar(12)=null,
    @FromDate varchar(12)=null

select * from calllist As c where c.CallDate between 
CONVERT(datetime, isnull(@ToDate,c.CallDate)) 
and CONVERT(datetime,isnull(@FromDate,c.CallDate))
0 голосов
/ 22 сентября 2014
DECLARE @BgnDate date,
 @EndDate date

SELECT @BgnDate = MIN(c.CallDate),  @EndDate = MIN(c.CallDate) FROM CallList

Select * FROM CallList c
Where c.CallDate > ISNULL(@FromDate,@BgnDate) 
and c.CallDate < ISNULL(@ToDate,@EndDate) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...