2017-09-04 1155 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的解决方案更好。

相关问题