Kettle 数据库查找不区分大小写

Kettle database lookup case insensitive

我的 table "City" 有超过 10 万条记录。 "name" 字段包含 "Roma"、"La Valletta".

等字符串

我收到一个包含城市名称的文件,全部为大写,如 "ROMA"。 当我搜索 "ROMA".

时,我需要获取包含 "Roma" 的记录的 ID

在 SQL 中,我必须执行以下操作:

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

如何在 kettle 中执行此操作?

注意:如果找不到城市,我会使用 Insert/update 字段来创建它,因此我必须避免由区分大小写的名称生成的重复项。

您可以使用 Pentaho Kettle 中的 字符串操作 步骤。将 Lower/Upper 选项设置为 Y

将城市(名称)从城市 table 传递到字符串操作步骤,这将执行数据流的大写,即城市名称。 Join/lookup 使用接收到的文件并获取所需的 ID。

更多关于 pentaho wiki 中的字符串操作步骤。

您可以使用 'Database join' 步骤。这里可以写sql:

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

并指定文本文件中的城市字段名称作为参数。使用 'Number of rows to return' 和 'Outer join?' 您可以控制加入行为。

此解决方案不适用于大量行,因为它将对每一行执行一个查询。在这些情况下,Rishu 的解决方案更好。

我是这样做的:

创建查询的第一步 "Modified JavaScript value":

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

此系统查询文件的行,但它使用很少的内存缓存