SQL Server - 使用棘手的where子句进行查询

时间:2016-11-24 07:01:01

标签: sql sql-server

我有一个报告,用户可以在这三个中选择一个过滤值,并且可以在点击提交按钮之前传递日期范围(“从日期”和“到日期”):

  1. 日期范围内的事件
  2. 日期范围内的新客人
  3. 超出日期范围的新客人
  4. 我想针对所选过滤器值在 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子句中检查所有三个过滤器值。

    有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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 > '')

答案 1 :(得分:0)

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

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