在Where子句使用Case中使用参数化列

时间:2017-08-18 15:14:27

标签: sql sql-server reporting-services where-clause ssrs-2012

我正在SSRS中构建一个报告,我需要让我们的用户过滤不同的日期字段。他们需要能够选择日期过滤器,然后选择该过滤器中的开始和结束日期。

这是我想要实现的简化示例:

SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date, Project.Start_Date, Project.Review_Date
FROM Project
WHERE @datetypefiler BETWEEN @startdate AND @enddate

@datetypefiler基本上等于用户希望过滤的字段(即Project.Update_Date或Project.Due_Date等)

在SSRS上,我为@datetypefiler构建了可以等于各种日期字段的参数,并按预期设置了开始日期和结束日期过滤器。

不幸的是,我似乎不能以这种方式参数化@datetypefiler?然后我尝试使用Case关键字:

SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date, Project.Start_Date, Project.Review_Date
FROM Project
WHERE CASE 
when @datetypefiler='Project.Update_Date' then Project.Update_Date BETWEEN @startdate AND @enddate
when @datetypefiler='Project.Due_Date' then Project.Due_Date BETWEEN @startdate AND @enddate

这对我来说也不起作用,我认为不应该在黑暗中拍摄,我应该问一下正确的方法会是什么样子。对此有任何建议将不胜感激,

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

SELECT * 
FROM Project
WHERE  (@datetypefiler='Project.Update_Date' 
                    AND Project.Update_Date BETWEEN @startdate AND @enddate)
    OR (@datetypefiler='Project.Due_Date' 
                    AND Project.Due_Date BETWEEN @startdate AND @enddate)

如果OR匹配,@datetypefiler将仅评估完整陈述。

答案 1 :(得分:1)

或者你可以试试这个

SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date, 
Project.Start_Date, Project.Review_Date 
FROM Project
where 
(CASE 
when @datetypefiler = 'Project.Update_Date' then Project.Update_Date 
when @datetypefiler= 'Project.Due_Date' then Project.Due_Date 
END) BETWEEN @startdate AND @enddate

答案 2 :(得分:0)

虽然其他两个答案都可以正常使用,但他们不会使用索引。我建议根据您的条件,使用两个不同的SELECT语句和两个不同的查询,这样您就可以在Update_DateDue_Date上对您的表进行索引并实际使用它们加快你的查询速度。