2017-09-04 75 views
0

我有一個表「城市」與超過10萬條記錄。 字段「名稱」包含「Roma」,「La Valletta」等字符串。Kettle數據庫查詢不區分大小寫

我收到一個帶有城市名稱的文件,全部大寫,如「ROMA」中所示。 當我搜索「ROMA」時,我需要獲取包含「Roma」的記錄的ID。

在SQL,我必須這樣做:

select id from city where upper(name) = upper(%name%) 

我怎樣才能做到這一點的水壺?

注意:如果找不到城市,我使用插入/更新字段來創建它,所以我必須避免由區分大小寫的名稱生成重複項。

回答

0

這是我如何做:

第一「修改JavaScript值」步驟,創建一個查詢:

var queryDest="select coalesce((select id as idcity from city where upper(name) = upper('"+replace(mycity,"'","\'\'")+"') and upper(cap) = upper('"+mycap+"')), 0) as idcitydest"; 

然後我用這個字符串作爲動態SQL行的查詢。

之後,

IF idcitydest == 0 then 
    insert new city; 
else 
    use the found record 

該系統使文件的行查詢,但它很少使用內存高速緩存

2

您可以使用Pentaho Kettle中的字符串操作步驟。將Lower/Upper選項設置爲Y

將City表中的城市(名稱)傳遞到字符串操作步驟,該步驟將執行數據流的大寫字母,即城市名稱。加入/查找收到的文件並獲取所需的ID。

更多關於字符串操作步驟pentaho wiki

+0

我投了該解決方案。 – AlainD

+0

使用「流查找」或「合併連接」來加入這兩個流。確保你瞭解這兩個步驟之間的差異。 – matthiash

+0

表「城市」有超過10萬條記錄,所以,我認爲這是一個昂貴的解決方案(cpu時間和內存緩存) –

0

您可以使用「數據庫連接」步驟。在這裏您可以編寫sql:

select id from city where upper(name) = upper(?) 

並指定城市字段名稱作爲參數的文本文件。用'返回的行數'和'外部連接?'您可以控制連接行爲。

該解決方案不適用於大量的行,因爲它將每行執行一個查詢。在這些情況下,Rishu的解決方案更好。