|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : décembre 2003 Messages : 4 ![]() |
Bonjour,
A partir d'une table contenant des individus, je souhaite pouvoir différencier les personnes dont le noms contiennent des chiffres afin de ne pas les traiter par des requêtes d'uniformisation de la base. La solution que j'ai trouvée consiste à "effacer" du nom tous les chiffres à l'aide de la fonction LTRIM puis de comparer la longueur de chaine de caractère à celle initiale. Si la chaîne initiale est différente (inférieure) de celle traitée par LTRIM, cela signifie qu'elle contient des chiffres. Voici mon code : Code :
|
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
C’est basique non ? Il vous dit qu’il ne connaît pas char_length. En Oracle la fonction est length.
Mais votre algo ne marche pas pour TOTO92 ni pour TO92TO. |
|
|
10
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : décembre 2003 Messages : 4 ![]() |
Merci mnitu
Effectivement, la fonction LENGTH est plus appropriée. En ce qui concerne mon algorithme, effectivement celà ne marchera pas dans les cas données ( TO92TO et TOTO92). En fait, je recherche un moyen plus simple d'éviter à utiliser les conditions suivantes : Code :
J'ai déjà trouvé et essayé des propositions telles que "[0-9]" mais elles ne marchent pas. |
||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
A partir de la version 10g vous pouvez utiliser des expressions régulières
Code :
|
||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 440 ![]() |
Avec translate, c'est fait pour.
J'ai géré le cas du nom NULL avec les NVL sur les length, ça dépend du besoin. Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
10
|
|
|
#6 |
|
Invité de passage
![]() Inscription : décembre 2003 Messages : 4 ![]() |
Merci à Mnitu (mais je ne peux pas utilisé les regexp) et à MCM pour cette solution qui fonctionne très bien.
J'avais déjà essayé avec la fonction TRANSLATE() sans succès, comment pouvez-vous me traduire en explications le fonctionnement de "TRANSLATE(nom, 'a0123456789', 'a')" je crois que quelque chose m'échappe ... Cordialement. |
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 440 ![]() |
translate remplace chaque caractère du 2nd param (à remplacer) par le caractère à la même position du 3ème param (remplacement).
translate(chaine, '123', '456') => remplace tous les 1 par 4, tous les 2 par 5 et tous les 3 par 6. S'il n'y a pas de caractère à la même position de remplacement, on remplace par NULL (on supprime donc le caractère de la chaine). Le troisième paramètre est obligatoire et non null (sinon translate va renvoyer null), donc tu es obligé de remplacer quelque chose par quelque chose. Dans le cas présent, on remplace 'a' par 'a', et les chiffres 0-9 par rien. L'autre utilisation intéressante de translate est la double utilisation pour supprimer tous les caractères autres que 0-9 par exemple. Si tu comprends bien cet exemple translate n'aura plus de secret pour toi. Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
20
|
|
|
#8 |
|
Invité de passage
![]() Inscription : décembre 2003 Messages : 4 ![]() |
Merci pour ces explications claires et ces exemples parlants.
Effectivement, cette fonction est vraiment intéressante.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com