动态SQL查询作为参数

时间:2017-03-01 09:34:15

标签: sql pentaho where-clause pentaho-report-designer

我需要一个报告,用户必须选择2个参数。第一个参数包含年份(2017年,2016年......),第二个参数包含ID流程。根据用户选择的进程,SQL语句将是一个或另一个。参数year是第二个参数中包含的SQL的WHERE子句的一部分。

所以我的报告包含2个参数(param_yearIndicador)。 Query参数使用表数据源完成,其中IDs列包含SQL语句,Values列包含用户必须选择的文本。

Setting the parameter

所以我接下来要做的是set ${Indicador}作为我对数据库所做的JDBC连接中的SQL语句。这是报告我的SQL错误

  

“查询失败:$ {Indicador}。

Setting the parameter as the SQL statement

任何建议将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:0)

您需要Pentaho Data Integration来执行此类动态查询

答案 1 :(得分:0)

如果两个查询的表结构(输出列)相同,则可以将它们放在一个带有UNION ALL的大SQL语句中,并将每个查询放入“WHERE $ {Indicador} = ValueToRunThisQuery”。

优化器应该足够聪明,知道未选择的子查询将返回零行,甚至不运行它。如果一个查询的列数较少,则可以提供一些空列,但填充列的数据类型必须相同。

如果两个查询之间的输出表结构不同,则它们应该位于不同的数据源中,甚至是报告中。

SELECT ID, BLA, BLA, BLA, ONLY_IN_A
FROM TABLE A
WHERE ${Indicador} = "S010"
UNION ALL
SELECT ID, BLA, BLA, BLA, NULL
FROM TABLE B
WHERE ${Indicador} = "S020"

答案 2 :(得分:0)

另一种选择是在主/子报告中创建多个数据源,然后在Master/sub Report -> Attributes -> query -> name属性使用PRD表达式选择适当的数据源

更详细的说明:

  1. 为您需要的每个SQL字符串创建一个查询(我的意思是作为PRD对象的查询,它使用PRD数据源),并将SQL字符串从参数表移动到Report Designer查询定义中。
  2. 将参数表中的SQL字符串替换为相应查询的名称,例如: parameter table
  3. 使用参数的值(应该等于PRD查询名称)作为Master/sub Report -> Attributes -> query -> name属性的值: query name expression