2016-04-28 56 views
1

我是Pentaho的新手,我正在運行一個轉換,其中我首先查詢數據庫以獲取id列表,然後使用列表的where子句中的列表查詢另一個數據庫的sql語句。即Pentaho在sql中插入一個列表,其中子句

其中ORDER_ID在({list}裏)

如何指定變量(ID列表),然後將它們penthao添加到查詢語句中的表輸入?

謝謝,

回答

0

有一些方法可以做到這一點,但他們不是很有效。除非您的查詢非常大,否則我認爲您最好使用而不是'where order_id in {list}'過濾器並使用流查找步驟獲取所需的字段。

1

您可以通過選中「在腳本中替換變量?」來導致變量在Table input步驟中展開。並指定where order_id in(${list})

但是,如果值的列表很長,我會考慮使用Stream Lookup步驟代替。 Stream查找步驟在轉換運行開始時將來自一個源的值讀入緩存,然後在常規運行期間查找流經緩存的每個行的緩存。

這將是這個樣子:

enter image description here

從「數據網格」中的值會先讀,然後用作查找緩存的所有值從「表輸入」步驟。然後,您可以添加一個Filter rows步驟來關閉查找失敗的任何內容。

0

使用動態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 
相關問題