2016-11-24 45 views
0

我有一个报告,其中用户可以选择一个过滤器值这三个当中,可以点击提交按钮前通过的日期范围(“从日期”和“终止日期”)查询:SQL服务器 - 棘手的where子句

日期范围内
  1. 活动
  2. 新的日期范围内的客人
  3. 新客人除了日期范围

我想在火选择查询myTable的表示所选的过滤器值。

如果用户选择第一个值(1),则查询应提供所有记录,其中dtEventDate位于输入的日期范围之间。

如果用户选择第二个值(2),查询应该给出dtGuestCreatedDate在输入日期范围之间的所有记录。

同样,如果用户选择第三个值(3),则查询应该给出dtGuestCreatedDate大于'To Date'的所有记录。

我的查询会是这样,

Select * from myTable 
where 
if '#filterValue#'='Events within Date Range' 
then myTable.dtEventDate between '' and '' 
else if '#filterValue#'='New Guests withing Date Range' 
then myTable.dtGuestCreatedDate between '' and '' 
else myTable.dtGuestCreatedDate > '' 

我不知道我该怎么写这个条件。

我有这个迄今为止,这将使我的日期范围内的事件:

select * from myTable 
where myTable.dtEventDate between 
case when '#filterValue#'='Events Within Date Range' then '10/01/2016' end 
and '11/30/2016' 

但我需要在where子句检查于一身的三个滤值。

任何人都可以帮忙吗?

+0

你使用哪种编程语言?您应根据用户选择的过滤器值动态构建您的'WHERE'条件 – rbr94

回答

1

你可以做这样的事情,根据您给的例子:

Select * from myTable 
where 
    ('#filterValue#'='Events within Date Range' AND myTable.dtEventDate between '' and '') 
    OR 
    ('#filterValue#'='New Guests withing Date Range' AND myTable.dtGuestCreatedDate between '' and '') 
    OR 
    ('#filterValue#'='New Guests Beyond Date Range' AND myTable.dtGuestCreatedDate > '') 
+0

太棒了!这工作。 –

+0

太棒了!很高兴我能帮上忙。 –

0
select * from myTable 
where case @filtervalue 
    when 'Events within daterange' then myTable.dtEventDate between ... 
    when 'New Guests within daterange' then ... 
    ... 
    end 

另外,我强烈建议您使用参数化查询避免SQL注入攻击。假设你的环境允许这样做。

+0

这会引发错误 - 在' –

+0

之间的关键字附近语法不正确......只是一个占位符,无论您想要放在那里的任何条件如何。基本上在那之后**当**关键字时,你可以把任何布尔条件,你可能想检查。从逻辑上讲,相当于Jakub的答案,只是少一点类型。 –

+0

你试过了吗?它会抛出一个错误。 –