传递SQL运算符以通过iReport参数进行查询

时间:2013-02-28 21:02:10

标签: sql oracle parameters jasper-reports ireport

我正在尝试基于处理事务的oracle SQL查询在iReport中创建报表。所涉及的实际表格非常冗长,与问题无关。我正在尝试创建一个报表,当交易金额满足以下3个标准中的1个时,该报表将返回结果:

  • 介于1000.00和2499.99之间
  • 介于2500.00和9999.99之间
  • > = 10000.00

我正在尝试创建一个选择列表参数,其中运行报表的人可以在上述规范之一中进行选择。在我实际创建参数之前,我一直在尝试在SQL Developer中测试查询。我试图实现此问题的查询行是:

alias.transaction_amount :amountRange

我的测试输入是“介于1000和9999之间”。当在查询中硬编码时,它工作正常,但当我尝试通过此输入传入它时,我得到一个“无效的关系运算符”错误。

还有另一种方法吗?

2 个答案:

答案 0 :(得分:1)

尝试在查询中使用这样的:
select table from table1 where transaction_amount $ P!{paramReport}

来自JasperReports终极指南:

$P{paramName} Syntax
The parameters are used like normal java.sql.PreparedStatement parameters, using
the following syntax:
<queryString>
<![CDATA[
SELECT * FROM Orders WHERE OrderID <= $P{MaxOrderID} ORDER BY
ShipCountry
]]>
</queryString>

$P!{paramName} Syntax
Sometimes it is useful to use parameters to dynamically modify portions of the SQL
query or to pass the entire SQL query as a parameter to the report-filling routines. In
such cases, the syntax differs a little, as shown in the following example. Notice the !
character:
<queryString>
<![CDATA[
SELECT * FROM $P!{MyTable} ORDER BY $P!{OrderByClause}
]]>
</queryString>

答案 1 :(得分:0)

在与一些同事交谈后,我们发现了一个更好的解决方案,虽然我不知道我正在寻找的方法是否真的可行,但这个解决方案更加直观。

alias.transaction_amount between (CASE WHEN $P{Range} = 0
                                       THEN 1000.00
                                       WHEN $P{Range} = 1
                                       THEN 2500.00
                                       ELSE 10000.00
                                       END)
                                 and
                                 (CASE WHEN $P{Range} = 0
                                       THEN 2499.99
                                       WHEN $P{Range} = 1
                                       THEN 9999.99
                                       ELSE 9999999.99
                                       END)

使用带有switch参数的case语句可以很好地工作,如果有一笔10亿美元或更高的交易,它们将被排除,但最大数量可以根据需要进行调整。