2

我需要为我的搜索页面编写查询。我的过滤器如下所示:

@StartDateForColumn1 datetime,
@FinishDateForColumn1 datetime,
@StartDateForColumn2 datetime,
@FinishDateForColumn2 datetime,

它们都可以为空。如果是这样,我需要所有数据:

select * from Table1

例如:如果仅@FinishDateForColumn1由用户填写,则查询将是:

select * from Table1 where Column1<@FinishDateForColumn1 

所以我不想为所有条件都写 if-else。有没有其他最短的方法来为这个例子编写查询?也许我需要使用coalesce,但我不知道如何在这个查询中使用它。

4

4 回答 4

3

您可以按以下方式使用coalesce, 或,isnull

select * 
from Table1 
where Column1<= isnull(@FinishDateForColumn1, Column1)

注意。这确实假设您的 column1 数据不包含空值。

于 2013-07-30T13:01:33.887 回答
1

您可以执行以下操作,如果每个参数为空(通过强制谓词条件为真),则基本上忽略每个参数,或者如果存在则在比较中使用它。

select *
from Table 1
where
  Column1 < case when @StartDateForColumn1 is null then Column1 + 1 else @StartDateForColumn1 end
  and Column1 < case when @FinishDateForColumn1 is null then Column1 + 1 else @FinishDateForColumn1 end
  and ...
于 2013-07-30T13:01:19.610 回答
1

像使用 ISNULL 这样简单的东西可能就足够了。

WHERE 
    Column1 BETWEEN 
        ISNULL(@StartDateForColumn1, CAST('1 Jan 1753' as DATETIME)) 
        AND
        ISNULL(@EndDateForColumn1, CAST('1 Jan 9999' as DATETIME))
    AND
        Column2 BETWEEN 
            ISNULL(@StartDateForColumn2, CAST('1 Jan 1753' as DATETIME)) 
            AND
            ISNULL(@EndDateForColumn2, CAST('1 Jan 9999' as DATETIME))
于 2013-07-30T13:10:17.970 回答
0

以下假设您没有任何超出 01/01/1971 和 31/12/2099 范围的日期。

select * 
from Table1 
where Column1< ISNULL(@FinishDateForColumn1,'31/Dec/2099') 
and Column1 > ISNULL(@StartDateForColumn1, '01/Jan/1971')
and Column2< ISNULL(@FinishDateForColumn2,'31/Dec/2099') 
and Column2 > ISNULL(@StartDateForColumn2, '01/Jan/1971')
于 2013-07-30T13:03:16.597 回答