Поиск в базе данных Kettle нечувствителен к регистру

У меня есть таблица «Город» с более чем 100 тыс. записей. Поле «имя» содержит такие строки, как «Рома», «Ла Валлетта».

Получаю файл с названием города, все в верхнем регистре как в "ROMA". Мне нужно получить идентификатор записи, содержащей «Roma», когда я ищу «ROMA».

В SQL я должен сделать что-то вроде:

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

Как я могу сделать это в чайнике?

Примечание: если город не найден, я использую поле «Вставить/обновить» для его создания, поэтому я должен избегать дубликатов, генерируемых именами с учетом регистра.


person Daniele Licitra    schedule 04.09.2017    source источник


Ответы (3)


Вы можете использовать шаги Операции со строками в Pentaho Kettle. Установите для параметра Lower/Upper значение Y

Передайте город (имя) из таблицы City на шаги операций со строками, которые будут выполнять верхний регистр вашего потока данных, то есть название города. Присоединяйтесь/ищите полученный файл и получите требуемый идентификатор.

Подробнее об шаге операций со строками читайте в вики Pentaho.

person Rishu Shrivastava    schedule 05.09.2017
comment
Используйте «Поиск потока» или «Объединение», чтобы соединить два потока. Убедитесь, что вы понимаете разницу между этими двумя шагами. - person matthiash; 07.09.2017
comment
В таблице city более 100 тыс. записей, поэтому я думаю, что это дорогое решение (время процессора и кеш памяти). - person Daniele Licitra; 10.10.2017

Вы можете использовать шаг «Присоединение к базе данных». Здесь вы можете написать sql:

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

и укажите в качестве параметра название поля города из текстового файла. С «Количество возвращаемых строк» ​​и «Внешнее соединение?» вы можете контролировать поведение присоединения.

Это решение плохо работает с большим количеством строк, так как будет выполняться один запрос на строку. В этих случаях решение Ришу лучше.

person matthiash    schedule 07.09.2017

Вот как я сделал:

Первый шаг «Измененное значение 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

Эта система делает запрос строки файла, но использует мало кэш-памяти.

person Daniele Licitra    schedule 10.10.2017