我读过很多关于NULLS
和SSRS报告参数的文章,但似乎没有一篇能解决我的问题。
我有一个用户可选择的SSRS报告参数@NoteType
,它可以是1、3、4或NULL
。我正在使用的数据库表(eventText
(有一列NoteValue
,其中包含这4个值中的1个。不幸的是,我无法更改表的设计以用整数代替NULL
值。
如果@NoteType = 1, 3 or 4
;但如果CCD_ 8。如果是@NoteType = NULL
,那么,根据我的参数化WHERE
子句(下面讨论(,我的报告要么没有行,要么有NoteValue = 1, 3 or 4
的所有行。如果用户选择@NoteType = NULL
,我不知道如何检索NoteValue = NULL
所在的行。
我已经将@NoteType
参数配置为允许NULL
值,其中Note Value
作为参数的值字段,Note Type
作为标签字段。参数值是从UNION
查询中获得的:
SELECT ett.NoteValue AS [Note Value],
ett.NoteDescription AS [Note Type]
FROM eventTextType ett
UNION
SELECT NULL AS [Note Value],
'Blank' AS [Note Type]
ORDER BY [Note Type]
eventTextType
表只有3行,其中NoteValue
列值分别为1、3或4。在eventTextType
表中没有NoteValue = NULL
的行,但在eventText
表中有许多这样的行。这就是为什么我使用UNION
查询来包括NULL
作为@NoteType
参数值之一。
UNION
查询的输出为:
Note Value Note Type
4 Annuity
1 Balance
NULL Blank
3 Division
我怀疑问题出在WHERE
子句中,该子句使用@NoteType
参数来检索报表的行。以下是我尝试过的:
WHERE et.NoteValue = @NoteType
—适用于@NoteType=1、3或4;但如果@NoteType=NULL ,则不返回任何行
WHERE et.NoteValue = IIF(@NoteType IS NULL, NULL, @NoteType)
——相同结果
WHERE et.NoteValue = CASE WHEN @NoteType IS NULL THEN NULL ELSE @NoteType END
——相同的结果(预期,因为这相当于IFF
版本(
WHERE et.NoteValue = COALESCE(@NoteType, et.NoteValue)
——适用于@NoteType = 1, 3 or 4
;但是如果@NoteType = NULL
返回NoteValue
列值为1、3或4的所有行,但没有行NoteValue
列值=NULL
我应该使用什么WHERE
子句?
假设主数据集的数据集是一个数据集查询(而不是存储过程(,那么我只需将一个有效的参数值(我在这个示例中使用了0
(添加到参数列表中,并在数据集查询中替换它。
因此,更改为提供参数值的数据集查询
SELECT ett.NoteValue AS [Note Value],
ett.NoteDescription AS [Note Type]
FROM eventTextType ett
UNION
SELECT 0 AS [Note Value],
'Blank' AS [Note Type]
ORDER BY [Note Type]
现在,在您的主数据集查询中,您可以将where子句更改为这个(如果需要,它还将处理多值参数(
WHERE ISNULL(et.NoteValue, 0) IN(@NoteType)
除非我错过了一些明显的东西,否则应该是这样。