Pentaho在sql中插入一个列表,其中子句
我是Pentaho的新手,我正在运行一个转换,其中我首先查询数据库以获取id列表,然后使用列表的where子句中的列表查询另一个数据库的sql语句。即Pentaho在sql中插入一个列表,其中子句
其中ORDER_ID在({list}里)
如何指定变量(ID列表),然后将它们penthao添加到查询语句中的表输入?
谢谢,
有一些方法可以做到这一点,但他们不是很有效。除非您的查询非常大,否则我认为您最好使用而不是'where order_id in {list}'过滤器并使用流查找步骤获取所需的字段。
使用动态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})
]]>
</>
你不需要逃避<>字符,但你需要自己算账替代list
:sqlQuery = sqlQuery.toString().replace("{list}", list, "g")
最后,你必须指定你的sqlQuery变量在JS步骤的“Fields”表中,这样它就会作为一个新字段添加到每一行中。
然后在动态SQL加入您需要指定SQL field name
中的sqlQuery字段。在Template SQL
中,您必须放置与您生成的查询具有相同数据类型的任何查询,例如像这样:
SELECT * FROM table_name WHERE 1=0