【问题标题】:Passing SQL operators to query through iReport Parameter通过 iReport 参数传递 SQL 运算符进行查询
【发布时间】:2013-02-28 21:02:10
【问题描述】:

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

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

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

alias.transaction_amount :amountRange

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

还有其他方法吗?

【问题讨论】:

  • 你的 :amountRange 是一个字符串吗?您是否尝试对整个表达式“1000.00 到 2499.99”使用单个参数?然后你需要在 SQL 中测试同样的东西,看看......我对 iReports 了解不多,但看起来你想使用一些表达式构建动态 where 子句,这在 SQL 中不起作用。在 Oracle 报告中,有用于此的词法参数。也许有smth。在您的 iReports 中类似...
  • 是的 :amountRange 是一个字符串,它是整个表达式。但是我明白了,我不认为它会被支持,但我认为它值得一试,但也许 iReport 确实支持它。

标签: sql oracle parameters jasper-reports ireport


【解决方案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>

【讨论】:

  • 那么如果我要使用这种语法,我是否必须将整个 where 子句放在参数中?或者我可以把它缩小到 alias.transaction_amount $P!{Amount_Range} 吗?谢谢你的回复
【解决方案2】:

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

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 亿美元或更多的交易,它们将被排除在外,但可以根据需要调整最大数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多