我需要为我的搜索页面编写一个查询。 我的过滤器看起来像这样:
@StartDateForColumn1 datetime,
@FinishDateForColumn1 datetime,
@StartDateForColumn2 datetime,
@FinishDateForColumn2 datetime,
所有这些都可以为空。如果是这样,我需要所有数据:
select * from Table1
例如:如果用户只填写@FinishDateForColumn1
,则查询将为:
select * from Table1 where Column1<@FinishDateForColumn1
所以我不想为所有条件写if-else。是否还有其他最简短的方法来为此示例编写查询?也许我需要使用coalesce,但我不知道如何在此查询中使用它。
答案 0 :(得分:3)
您可以按以下方式使用coalesce
或isnull
select *
from Table1
where Column1<= isnull(@FinishDateForColumn1, Column1)
NB。这确实假设您的column1数据不包含空值。
答案 1 :(得分:1)
您可以执行以下操作,如果它是null(通过强制谓词条件为真),则基本上忽略每个参数,或者如果它存在,则在比较中使用它。
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 ...
答案 2 :(得分: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))
答案 3 :(得分: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')