SSRS和PostgreSQL:如何传递可选参数?

7
我正在一个SSRS报表中使用PostgreSQL ODBC数据源。
根据我以前使用MS SQL Server数据源的经验,在向SSRS数据集查询传递可选参数时,你需要这样做:
SELECT *
FROM MyTable
WHERE SomeField = @Param1 OR @Param1 IS NULL

关键在于使用OR @Param1 IS NULL,这基本上绕过了SomeField = @Param1的部分,并有效地充当了一个“可选”过滤器。然而,在使用PostgreSQL ODBC数据源时,这似乎不起作用(不确定是由于Postgres还是ODBC还是两者都有)。单击“刷新字段”或执行/预览报告时,会出现错误。
这可能部分原因是无法将命名参数传递到SQL中,而必须像这样使用“?”:
SELECT *
FROM MyTable
WHERE SomeField = ?

"这使得基本上不可能执行 OR ? IS NULL。那么,有人知道我如何能够向 SSRS 中的 PostgreSQL 数据集传递可选参数吗?"

嗯,我想我可能意识到了我的错误。原来这个方法相当有效:WHERE (somefield = ? OR CAST(? AS <somefield's data type>) IS NULL)。所以,在参数 ? 上使用 CAST 是必要的,否则 SSRS 工具会给出未知数据类型的错误。而且我必须在数据集中使用 2 个参数来引用同一个参数两次(因为 WHERE 子句中有 2 个 ? 引用),但这并不可怕。不知道为什么我之前没有想到使用 CAST。 - Jiveman
1个回答

3

这不是一种特定的ODBC解决方案,而是一个解决方法。如果SomeField不能为null,则此方法可行:

select *
from mytable
where somefield = coalesce(?, somefield)

如果SomeField可以为null且您希望返回空值:

where somefield is not distinct from coalesce(?, somefield)

请查看不同于的相关信息。


嗯,有趣,谢谢。然而,我可以看出当SomeField不可为空时它是如何工作的。但如果它是可空的,它就不会起作用,因为“where somefield = NULL”不会匹配null值(与“where somefield IS NULL”相反)。如果我需要它像一个“可选”参数一样运作,那么当未指定参数时应该返回NULL值。 - Jiveman
可以了,谢谢!我还在学习PostgreSQL,所以对于is [not] distinct from并不熟悉。这个真的很酷。 - Jiveman
我发现了我在做错的地方(请参见我上面原始帖子中的评论),但我会将其标记为答案,因为它也很有效,并且非常干净。 - Jiveman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接