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 报告中将多个参数作为单独的多个页面传递?

将参数从 s-s-rS 数据集传递到雪花

如何使用 PostgreSQL 将数据从 AngularJS 前端传递到 Nodejs 后端?

使用存储过程在 s-s-rS 中传递多个字符串值

s-s-rS 2008 报告订阅电子邮件随机接收传递扩展加载错误

报告订阅 s-s-rS 中的电子邮件传递