0

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

  • 在 1000.00 和 2499.99 之间
  • 在 2500.00 和 9999.99 之间
  • >= 10000.00

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

alias.transaction_amount :amountRange

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

还有另一种方法吗?

4

2 回答 2

1

尝试在查询中这样使用:
select ... 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>
于 2013-03-01T06:32:23.600 回答
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 亿美元或更多的交易,它们将被排除在外,但可以根据需要调整最大数量。

于 2013-03-01T20:58:10.390 回答