Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2011, 09h15   #1
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 25
Points : 34
Points : 34
Par défaut Requête ORACLE avec tolérance aux erreurs de saisie utilisateur

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
olreak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h24   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Soundex existe dans ORACLE.
Un sujet (parmi tant d'autres) ici
Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h36   #3
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Voir du coté de UTL_RAW.cast_to_varchar2 et NLS_SORT (binary_ai) et les expression régulières
Exemple de code dans un trigger pour voir si un texte a changé en oubliant les espaces et les accents
Code :
1
2
3
4
5
6
7
8
9
10
 
 -- comparaison des commentaitres commerces sans accenst (NLS_SORT) et sans ponctuation ni espaces (REGEXP_REPLACE)
      IF
     ( UTL_RAW.cast_to_varchar2 (
            (NLSSORT (REGEXP_REPLACE (:new.obs_com, '[[:space:]|[:punct:]]*', ''), 'nls_sort=binary_ai'))) <>
            UTL_RAW.cast_to_varchar2 (
               (NLSSORT (REGEXP_REPLACE (:old.obs_com, '[[:space:]|[:punct:]]*', ''), 'nls_sort=binary_ai')))
      )
      THEN
....
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h29   #4
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 25
Points : 34
Points : 34
Merci pour ces deux réponses,

en fait c'est un peu ce que je cherche à éviter:
- SOUNDEX parce que présent uniquement en prononciation anglophone dans ORACLE, et de toute façon un "é" et un "e" se prononcent différemment alors que je veux les confondre, en en plus ça retourne un code et pas une chaîne de caractère (donc pas possible d'enchaine avecune autre fonction)
- la REGEXP, justement c'est j'aurai aimé éviter pour une question de performance

Merci quand même pour vos réponse, en fait pas certain qu'il y ait une solution simple vu que je vois qu'il semble se vendre des logiciels spécialisés pour effectuer la recherche de doublons "flous" sur une base ORACLE.
olreak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h36   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Si tu ne veux pas utiliser REGEXP, tu peux quand meme ignorer les accents avec UTL_RAW et NLS_SORT !

Code :
1
2
3
4
5
 
SELECT 
UTL_RAW.cast_to_varchar2 (
            (NLSSORT ('éaèùà','nls_sort=binary_ai')))
FROM dual
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h44   #6
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 25
Points : 34
Points : 34
oui, oui, cf mon premier post

Mais NLSSORT a le même problème que SOUNDEX, qui est de renvoyé un code qui lui est propre et pas une chaine de cararactère qui puisse être traitable par d'autres fonction.

Par ailleurs, pour info, plutôt que d'utiliser la fonction NLSSORT il est plus performant de faire des alter session pour positionner NLS_COMP à LINGUISTIC et NLS_SORT à FRENCH_AI (ou autrechose_AI)
olreak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h13   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par olreak Voir le message
...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...
...
Filtrez en deux étapes:
1) Lettre en double: regexp.
2) Autres (caractères accentués, les espaces, les tirets): Translate.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h39   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Si vous ne traitez pas de volumes trop important, vous pouvez regarder les fonction du package UTL_MATCH.

J'ai utilisé pour des problèmes similaires l'algorithme de Jaro-Winkler (pas parfaitement conforme à l'original cela dit), qui donne un score :
Code :
1
2
3
4
5
6
SELECT 100 * utl_match.jaro_winkler('olreak', 'olrik') AS score
  FROM dual;
 
     SCORE
----------
     87.56
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 12h20   #9
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 25
Points : 34
Points : 34
Merci pour cette réponse,

Je viens de faire quelques tests.
D'une part, par bonheur, les paramètres de session NLS_COMP et NLS_SORT sont pris en compte par REGEXP_LIKE et TRANSLATE,comme ça le problème des accents et majuscule est réglé.

Pour le reste:
1) je dois transformer par la données de comparaison fournie par l'utilisateur en regexp à construire intelligemment
2) REGEXP_LIKE sur le TRANSLATE de la colonne de la base, le translate étant utiliser ici pour supprimer tous les espaces, tirets...

Reste à construire cette regexp automatiquement et intelligemment...

Merci
olreak est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h37.


 
 
 
 
Partenaires

Hébergement Web