2017-09-04 1 views
0

J'ai une table "Ville" avec plus de 100k enregistrements. Le champ "nom" contient des chaînes comme "Roma", "La Valletta". Je reçois un fichier avec le nom de la ville, tout en majuscules comme dans "ROMA". Je dois obtenir l'identifiant de l'enregistrement contenant "Roma" lorsque je recherche "ROMA".Recherche de base de données de la bouilloire insensible à la casse

Dans SQL, je dois faire quelque chose comme:

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

Comment puis-je faire cela dans une bouilloire?

Remarque: Si la ville est introuvable, j'utilise un champ Insérer/Mettre à jour pour le créer. Je dois donc éviter les doublons générés par des noms sensibles à la casse.

Répondre

0

Voici comment je l'ai fait:

Première « valeur JavaScript modifié » étape pour créer une requête:

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

Puis-je utiliser cette chaîne comme une requête dans une ligne dynamique SQL.

Après cela,

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

Ce système font une requête pour la ligne de fichier, mais il utilise peu de mémoire cache

2

Vous pouvez utiliser le Opérations de chaîne étapes dans Pentaho Kettle. Définissez l'option Lower/Upper sur Y

Transmettez la ville (nom) de la table Ville aux étapes d'opérations Chaînes qui exécuteront la majuscule de votre flux de données, c'est-à-dire le nom de la ville. Rejoindre/rechercher avec le fichier reçu et obtenir l'identifiant requis.

Pour en savoir plus sur les opérations sur les chaînes, entrez pentaho wiki.

+0

Je vote pour cette solution. – AlainD

+0

Utilisez 'Recherche de flux' ou 'Fusionner une jointure' pour joindre les deux flux. Assurez-vous de comprendre la différence entre ces deux étapes. – matthiash

+0

La table "city" a plus de 100k d'enregistrements, donc, je pense que c'est une solution coûteuse (cpu time et cache mémoire) –

0

Vous pouvez utiliser une étape 'Jointure de base de données'. Ici vous pouvez écrire le sql:

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

et de spécifier le nom du champ de ville du fichier texte en tant que paramètre. Avec 'Nombre de lignes à retourner' et 'Connexion externe?' vous pouvez contrôler le comportement de la jointure.

Cette solution ne fonctionne pas bien avec un grand nombre de lignes, car elle exécutera une requête par ligne. Dans ces cas, la solution de Rishu est meilleure.