我正在处理SSRS报告,我的SQL查询的一部分就像
WHERE SuperVisorId IN (@SupervisorIDs) AND CreatedDate> @StartDate
其中@SupervisorIDs是一个下拉列表,可选择“全选”和各个主管。
因此,如果选择了主管“all”选项,那么我不需要在where子句中包含它,而我的where子句只是这个
WHERE CreatedDate> @StartDate
那么如何根据选择下拉列表
使WHERE子句看起来不同答案 0 :(得分:1)
All
选项的单值参数到可用值列表时才适用。多值参数不知道何时选择所有选项。 SQL Server并不总是按照您编写的顺序执行where
子句中的条件,因此如果您使用的是where (@p = 'all' or col = @p) and ...
,则可能仍在比较您的值。
如果需要考虑性能,可以使用短路case
来避免这种情况,只有在必要时才会进行实际的数据比较:
where case when @SupervisorIDs = 'All' then 1
else case when SuperVisorId = @SupervisorIDs then 1
else 0
end
end = 1
and CreatedDate > @StartDate
答案 1 :(得分:1)
假设您正在使用数据集查询来填充supervisor参数下拉列表,那么您可以尝试这样做。
创建一个布尔类型的附加隐藏参数。对于这个例子,我将它称为@AllSupsSelected。将参数的默认值设置为: = COUNT(参数!SupervisorIds.Label)= COUNT(字段!SupervisorIdLabel.Value, “SupervisorDataset”)
相应地替换字段和数据集名称。如果数据集返回非不同的值,您可能需要进一步修改以使其正常工作。
现在您的查询可以阅读:
WHERE @AllSupsSelected或SupervisorId IN(@SupervisorIds)
答案 2 :(得分:0)
制作你的where子句如下
WHERE (
(SuperVisorId IN (@SupervisorIDs))
OR (
@SupervisorIDs = 0
AND COLUMN_WITH_NULL IS NOT NULL
)
)
AND CreatedDate > @StartDate
选中时传递0"选择全部"
答案 3 :(得分: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
列表底部的值:< / p>
isnull
然后在您的数据集中设置类似于下面的过滤。我已经以这种方式构建它,以避免在SupervisorID
列上使用select cols
from tables
where SupervisorID in(@SupervisorID)
or (SupervisorID is null
and <Unique value from above> in (@SupervisorID)
)
函数,这会损害查询性能:
.test
答案 4 :(得分:-1)