Bonjour,
Je dois faire des requêtes sur un base ORACLE afin de rechercher, entre autres, des noms et prénoms en laissant la possibilité à l'utilisateur de commettre quelques erreurs. Typiquement, être indifférent aux caractères accentués et à la casse, mais aussi ne pas tenir compte des lettres en double qui se suivent, les espaces, les tirets...
Pour l'indifférence à la casse et aux caractères accentués j'ai trouvé les paramètres NLS_COMP et NLS_SORT, ou alors en utilisant la fonction NLSSORT directement dans mes requêtes.
Cependant je n'ai pas trouvé de moyen simple supprimer les lettres en double, les espaces, tirets...
TRIM ne supprime les espaces qu'en début et fin de chaine
SOUNDEX est basé sur les consonnance anglophone
Bref, le seul moyen qu'il y aurai serait de faire une recherche par expression régulière à fabriquer à la volée en fonction des données de la requête. Le problème c'est que, du coup il faudra que gère les accents à la main dans les regexp (et non plus utiliser les NLS_SORT), que je parse la requête initiale pour ajouter des cardinalités sur chaque caractère... et j'ai peur que les requête soient beaucoup moins efficaces en temps, sachant qu'il y a pratiquement des requêtes en permanence sur le serveur.
Une autre solution consisterait à définir une fonction PL/SQL réalisant se genre de chose, mais il y a plusieurs serveurs et je n'ai la main sur aucun d'eux directement, en tout cas pas avec les droits suffisants pour installer des choses sur le serveur. En revanche j'ai le contrôle sur les services qui font les requêtes puisque c'est moi qui les développe.
Un SOUNDEX ou PHONEX avec consonance française ce serait bien mais ça ne semble pas inclut dans ORACLE, et puis les prénoms et noms de familles ne sont pas toujours à consonance française, même en France.
Bref, est-ce que quelqu'un aurait une meilleure idée, parce que j'imagine que la recherche tolérante aux erreurs dans une base Oracle est assez classique, non?
Merci
Partager