多次重用参数

Posted

技术标签:

【中文标题】多次重用参数【英文标题】:Reusing parameters more than once 【发布时间】:2016-03-29 11:33:45 【问题描述】:

我正在用 BIRT 写报告。我的数据集有两个输入参数。

第二个参数我想在 where 子句中使用两次。我发现我可以使用 with 子句来做到这一点。请注意,这是一个 postgresql 数据库,所以我不需要 from dual

我的sql如下:

with "params" as (select ? as "sname", ? as "ename")
select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName"
from "user", "params"
LEFT JOIN "client" on "user"."client" = "client"."id" 
LEFT JOIN "provinces" on "user"."province" = "provinces"."id"
WHERE "user"."fullName" >= "params"."sname" and (("user"."fullName" <= "params"."ename") or ("params"."ename" =''))`

当我尝试运行此程序或在 BIRT 的编辑数据集屏幕中预览结果时,我收到以下错误:

运行报告时发生错误。 在 .... 原因:org.eclipse.birt.report.data.adapter.api.AdapterException:处理过程中发生异常。详情请查看以下消息: 未能为数据集准备查询执行:用户 无法获取结果集元数据。 org.eclipse.birt.report.data.oda.jdbc.JDBCException:SQL 语句不返回 ResultSet 对象。 SQL 错误 #1:错误:对表“用户”的 FROM 子句条目的引用无效 提示:表“user”有一个条目,但不能从这部分查询中引用它。 位置:252;

我受不了。从我所看到的一切来看,它应该可以工作。

【问题讨论】:

无关,但是:你可以做更短的 CTE:with params (sname, ename) as (values (?, ?) ) ... Mixing explicit and implicit joins fails with "There is an entry for table ... but it cannot be referenced from this part of the query"的可能重复 【参考方案1】:

您可以在 Birt 中的 SQL 查询中添加多个参数,并根据需要重复使用来自 Birt 的输入参数。 Compare my answer to this question.

因此您可以在没有with-clause 的情况下编写查询,并防止显式和隐式连接的混合:

select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName"
from "user"
LEFT JOIN "client" on "user"."client" = "client"."id" 
LEFT JOIN "provinces" on "user"."province" = "provinces"."id"
WHERE "user"."fullName" >= ? and (("user"."fullName" <= ?) or (? =''))

【讨论】:

这种工作。虽然 Birt 没有发现我的第二个参数是 = ''。所以我将参数默认为 null 并将 where 子句的结尾更改为:select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName" from "user" LEFT JOIN "client" on "user"."client" = "client"."id" LEFT JOIN "provinces" on "user"."province" = "provinces"."id" WHERE "user"."fullName" &gt;= ? and (("user"."fullName" &lt;= ?) or (? is null)) 我现在都解决了。谢谢您的帮助。希望我找到了您之前的解决方案。

以上是关于多次重用参数的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild 将参数传递给 CallTarget

ARG 构建参数----Dockerfle文件的重用

如何将参数发送到 HTTPService 调用以作为组件重用

如何在每次迭代中重用 SqlCommand 参数?

我可以在 Typescript 中重用函数的参数定义吗?

可以重用线程来运行可变参数函数吗?