如果参数为null,如何返回所有记录

时间:2011-05-25 22:04:29

标签: sql-server

以下是我的 SP

Alter PROCEDURE GetList 
(

@FromDate date = null,
@ToDate date = null

)
AS

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

如果没有通过日期过滤器,我想获取所有记录。

我该怎么办?

7 个答案:

答案 0 :(得分:14)

你可以这样做:

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

这也让你可以将其中一个日期留空而不是另一个日期。

答案 1 :(得分:6)

你会做以下

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

答案 2 :(得分:3)

一些可行的选择:

您可以将@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的查询总是最终得到非常好的优化 - 它们可能适用于某些参数集,但通常不是一刀切的

答案 3 :(得分:2)

尝试以下方法:

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

答案 4 :(得分:2)

每次动态sql都是complie,所以要防止使用动态sql

    select * from calllist As c
    where (c.CallDate < @ToDate or @ToDate is null)
and  (c.CallDate > @FromDate or @FromDate is null)

答案 5 :(得分:0)

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) 

答案 6 :(得分:0)

你也可以使用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))