s-s-rS 和 PostgreSQL:如何传递可选参数?
Posted
技术标签:
【中文标题】s-s-rS 和 PostgreSQL:如何传递可选参数?【英文标题】:s-s-rS and PostgreSQL: How do I pass an optional parameter? 【发布时间】:2016-04-03 17:58:55 【问题描述】:我在 s-s-rS 报告中使用 PostgreSQL ODBC 数据源。
根据我以前对 MS SQL Server 数据源的了解,要将可选参数传递给 s-s-rS 数据集查询,您可以这样做:
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
基本上是不可能的。
那么,有人知道我如何能够将可选参数传递给 s-s-rS 中的 PostgreSQL 数据集吗?
【问题讨论】:
嗯,我想我可能已经意识到我做错了什么。事实证明这很有效:WHERE (somefield = ? OR CAST(? AS <somefield's data type>) IS NULL)
。因此,参数?
上的 CAST 是必要的,否则 s-s-rS 工具会给您一个未知数据类型的错误。而且我必须在数据集中使用 2 个参数来引用同一个参数两次(因为 WHERE 子句中有 2 个 ?
引用),但这并不可怕。不知道为什么我以前没想过演员。
【参考方案1】:
不是特定的 ODBC 解决方案,而是一种解决方法。如果SomeField
不能是null
,这将起作用:
select *
from mytable
where somefield = coalesce(?, somefield)
如果SomeField
可以是null
并且您想返回空值:
where somefield is not distinct from coalesce(?, somefield)
查看is distinct from
【讨论】:
嗯,有趣,谢谢。但是,我可以看到当 SomeField 不可为空时它将如何工作。但如果它是可空的,它将不起作用,因为where somefield = NULL
不会匹配空值(与where somefield IS NULL
相对)。如果我需要它充当“可选”参数,那么也应该返回 NULL 值(当未指定参数时)。
那行得通。谢谢!我还在学习 PostgreSQL,所以我对is [not] distinct from
不熟悉。很酷。
我发现我做错了(请参阅上面我原来的帖子中的 cmets),但我会将其标记为答案,因为它也很好用,而且很干净。以上是关于s-s-rS 和 PostgreSQL:如何传递可选参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 s-s-rS 报告中将多个参数作为单独的多个页面传递?
如何使用 PostgreSQL 将数据从 AngularJS 前端传递到 Nodejs 后端?