[英]SSRS avoid WHERE clause if select all is selcted
我正在处理SSRS报告,我的SQL查询的一部分就像
WHERE SuperVisorId IN (@SupervisorIDs) AND CreatedDate> @StartDate
其中@SupervisorIDs是带有“全选”选项和单个主管的选项的下拉列表。
因此,如果选择了主管“ all”选项,那么我就不需要在where子句中包含它,而我的where子句仅是这个
WHERE CreatedDate> @StartDate
那么如何根据选择下拉列表使WHERE子句看起来不同
All
选项添加到可用值列表时,此选项才适用。 多值参数不知道何时选择所有选项。 SQL Server并不总是按照编写它们的顺序在where
子句中执行条件,因此,如果您使用where (@p = 'all' or col = @p) and ...
您可能仍在比较值。
如果需要考虑性能,可以使用短路case
来避免这种case
,只有在必要时才进行实际数据比较:
where case when @SupervisorIDs = 'All' then 1
else case when SuperVisorId = @SupervisorIDs then 1
else 0
end
end = 1
and CreatedDate > @StartDate
假设您正在使用数据集查询来填充主管参数下拉列表,则可以尝试此操作。
创建另一个布尔类型的隐藏参数。 对于此示例,我将其称为@AllSupsSelected。 将参数的默认值设置为:= COUNT(Parameters!SupervisorIds.Label)= COUNT(Fields!SupervisorIdLabel.Value,“ SupervisorDataset”)
相应地替换字段和数据集名称。 如果数据集返回的是不同的值,则可能需要进一步修补才能使此工作正常。
现在您的查询可以读取:
WHERE @AllSupsSelected或SupervisorId IN(@SupervisorIds)
使您的where子句如下所示
WHERE (
(SuperVisorId IN (@SupervisorIDs))
OR (
@SupervisorIDs = 0
AND COLUMN_WITH_NULL IS NOT NULL
)
)
AND CreatedDate > @StartDate
并在选择“全选”时传递0
作为对特定问题的实际答案,请设置多值参数数据集与此类似,以返回所有Supervisors
以及列表的底部No Supervisor
:
select distinct SupervisorID as Value
,SupervisorName as Label
,1 as Sort
from Suppliers
union all
select <Uniquely identifiable value with the same data type as SupervisorID> as Value
,'No Supervisor' as Label
,2 as Sort
order by Sort
,Label
然后在您的数据集中设置与下面类似的过滤。 我以这种方式构造它,以避免在您的SupervisorID
列上使用isnull
函数,这会影响查询性能:
select cols
from tables
where SupervisorID in(@SupervisorID)
or (SupervisorID is null
and <Unique value from above> in (@SupervisorID)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.