我有一个ASP.net搜索页面,用户可以在其中输入一个或多个搜索条件。该页面调用存储过程来查询MS SQL Server 2008 db。
部分搜索条件是单日期或日期范围。如果用户提供Date1,我们搜索单个日期。如果用户提供Date1和Date2,我们会搜索日期范围。
我的问题是在存储过程中对此逻辑进行编码。
@Date1 datetime
@Date2 datetime
..other search params...
所以有三个条件:
我无法弄清楚如何构造WHERE子句来处理三种可能的条件。
我熟悉ISNULL()
和COALESCE()
非常感谢任何提示或建议。
答案 0 :(得分:4)
CREATE PROCEDURE BLABLABLA(
@DATE1 DATETIME = NULL,
@DATE2 DATETIME = NULL
)
AS
BEGIN
SELECT COL1, COL2
FROM THE_TABLE
WHERE
THE_TABLE.DATETIMEFIELD BETWEEN
ISNULL(@DATE1, THE_TABLE.DATETIMEFIELD)
AND COALESCE(@DATE2, @DATE1, THE_TABLE.DATETIMEFIELD)
END
另一种选择,失去一些表现力但可能使用索引,可能是:
CREATE PROCEDURE BLABLABLA(
@DATE1 DATETIME = NULL,
@DATE2 DATETIME = NULL
)
AS
BEGIN
SELECT COL1, COL2
FROM THE_TABLE
WHERE
(THE_TABLE.DATETIMEFIELD >= @DATE1 OR @DATE1 IS NULL)
AND (THE_TABLE.DATETIMEFIELD <= @DATE2
OR THE_TABLE.DATETIMEFIELD = @DATE1
OR (@DATE1 IS NULL AND @DATE2 IS NULL))
END
答案 1 :(得分:1)
您可以尝试在SP中创建SQL查询作为字符串,然后执行它,如下所示:
...
declare @sql varchar(500)
set @sql = 'select from myTable where 1=1'
if(@Date1 <> null)
set @sql = @sql + ' and date1 >= '+ @date1
if(@Date2 <> null)
set @sql = @sql + ' and date2 <= '+ @date2
print(@sql) -- for debug
exec(@sql)