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

Using a Parameterized column in a Where Clause using Case

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

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

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

这对我也不起作用,我认为与其在黑暗中拍摄,不如问问正确的方法是什么样的。对此的任何建议将不胜感激,

您可以尝试这样的操作:

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)

如果 @datetypefiler 匹配,OR 将仅评估完整语句。

或者你可以试试这个

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

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