我有这个where子句:
WHERE p.ROLE = 'doctor'
AND((p6.PA_Name='Event_Day_From' AND p6.PA_Value>= SUBSTRING('01.01.2012', 1, 2))
AND (p7.PA_Name='Event_Month_From' AND p7.PA_Value>=SUBSTRING('01.01.2012', 4, 2))
AND (p8.PA_Name='Event_Year_From' AND P8.PA_Value>=SUBSTRING('01.01.2012', 7, 4)))
AND ((p9.PA_Name='Event_Day_To' AND P9.PA_Value<=SUBSTRING('30.12.2012', 1, 2))
AND (p10.PA_Name='Event_Month_To' AND P10.PA_Value<=SUBSTRING('30.12.2012', 4, 2))
AND (p11.PA_Name='Event_Year_To' AND P11.PA_Value<=SUBSTRING('30.12.2012', 7, 4)))
在上面之后我有一个union all
,最后我有另一个WHERE
条款与上面的相同。
在BIRT中,可以传递一个参数,您必须在需要传递的SQL查询中插入?
。正如您所看到的,我将通过用户输入传递开始日期和结束日期。现在我的问题是我不知道如何将SDate
参数传递给所有start dates
和EndDate
参数到所有end dates
我的问题有解决方案吗?
答案 0 :(得分:1)
[编辑] BIRT使用普通JDBC而不是它不支持“命名参数”,所以你不能写:
... p6.PA_Value>= SUBSTRING(:start, 1, 2) ...
这会出错。
其他选项是使用Property Binding或JavaScript构建查询,并在执行之前替换部分查询。 See this example report
某些数据库还支持WITH
语法,以便为?
参数指定别名。 This blog post解释了如何使用它。
答案 1 :(得分:1)
我通过创建带参数的单行表并将其附加到报表查询来解决此问题,如下所示:
,(select ? SDate, ? EDate) params
WHERE p.ROLE = 'doctor'
AND((p6.PA_Name='Event_Day_From' AND p6.PA_Value>= SUBSTRING(params.SDate, 1, 2))
AND (p7.PA_Name='Event_Month_From' AND p7.PA_Value>=SUBSTRING(params.SDate, 4, 2))
AND (p8.PA_Name='Event_Year_From' AND P8.PA_Value>=SUBSTRING(params.SDate, 7, 4)))
AND ((p9.PA_Name='Event_Day_To' AND P9.PA_Value<=SUBSTRING(params.EDate, 1, 2))
AND (p10.PA_Name='Event_Month_To' AND P10.PA_Value<=SUBSTRING(params.EDate, 4, 2))
AND (p11.PA_Name='Event_Year_To' AND P11.PA_Value<=SUBSTRING(params.EDate, 7, 4)))
希望这有帮助。
**我目前在PostgreSQL数据库上使用此方法。