Pentaho在sql中插入一个列表,其中子句

问题描述:

我是Pentaho的新手,我正在运行一个转换,其中我首先查询数据库以获取id列表,然后使用列表的where子句中的列表查询另一个数据库的sql语句。即Pentaho在sql中插入一个列表,其中子句

其中ORDER_ID在({list}里)

如何指定变量(ID列表),然后将它们penthao添加到查询语句中的表输入?

谢谢,

有一些方法可以做到这一点,但他们不是很有效。除非您的查询非常大,否则我认为您最好使用而不是'where order_id in {list}'过滤器并使用流查找步骤获取所需的字段。

您可以通过选中“在脚本中替换变量?”来导致变量在Table input步骤中展开。并指定where order_id in(${list})

但是,如果值的列表很长,我会考虑使用Stream Lookup步骤代替。 Stream查找步骤在转换运行开始时将来自一个源的值读入缓存,然后在常规运行期间查找流经缓存的每个行的缓存。

这将是这个样子:

enter image description here

从“数据网格”中的值会先读,然后用作查找缓存的所有值从“表输入”步骤。然后,您可以添加一个Filter rows步骤来关闭查找失败的任何内容。

使用动态SQL加盟:

您可以使用表输入的组合 - >集团通过 - >修改Java脚本的价值 - >动态SQL加盟。

表输入将根据需要选择ID列表。

集团通过您可以汇总ID列表到一个逗号分隔的字符串(

Name: "list" (the name of output field with list of IDs) 
Subject: name of the field with IDs from your Table Input, 
Type: "Concatenate strings separated by ," 

修改Java脚本值您可以定义XML文本,包括您的SQL查询(如果您不介意将查询保留在一行中,则可以使用String来代替{list})。

var sqlQuery = <> 
    SELECT 
     * 
    FROM table_name 
    WHERE 
     order_id IN ({list}) 
</> 

如果像这样使用,然后{list}将自动与list变量(或列的值)的值取代。但是您需要在查询中跳过<和>个字符。 或者,您可以把您的查询在CDATA:

var sqlQuery = <> 
    <![CDATA[ 
     SELECT 
      * 
     FROM table_name 
     WHERE 
      order_id IN ({list})  
    ]]> 
</> 

你不需要逃避<>字符,但你需要自己算账替代listsqlQuery = sqlQuery.toString().replace("{list}", list, "g")

最后,你必须指定你的sqlQuery变量在JS步骤的“Fields”表中,这样它就会作为一个新字段添加到每一行中。

然后在动态SQL加入您需要指定SQL field name中的sqlQuery字段。在Template SQL中,您必须放置与您生成的查询具有相同数据类型的任何查询,例如像这样:

SELECT * FROM table_name WHERE 1=0