IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Remplacement de tous les caractères accentués par leur équivalent non accentué


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Remplacement de tous les caractères accentués par leur équivalent non accentué
    Bonjour à tous,

    Pour le projet sur lequel je travaille, nous avons une table DWG qui contient entre autres les colonnes DWG_NUMBER et DWG_NUMBER_SIMPLIFIED.
    Le n° simplifié est généré programmatiquement en Java. Les règles sont:
    1. remplacement de tous les caractères accentués par leur équivalent non accentué (é => e, à => a, ç => c, ñ => n, ...)
    2. suppression de tous les caractères non alphanumériques
    3. mise en majuscule

    Malheureusement, en base nous avons des n° simplifiés incorrects. J'essaie d'écrire une requête SQL permettant d'identifier tous ces cas. Je suis arrivé à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DWG_NUMBER, DWG_NUMBER_SIMPLIFIED
    FROM DWG
    WHERE DWG_NUMBER_SIMPLIFIED NOT LIKE UPPER(REGEXP_REPLACE(TRANSLATE(DWG_NUMBER, 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý', 'aaaaaaaceeeeiiiinoooooouuuuyaaaaaaaceeeeiiiinoooooouuuuy'), '[^A-Za-z0-9]', ''))
    ORDER BY DWG_NUMBER;
    C'est assez bourrin et ça ne me satisfait pas (ma chef non plus d'ailleurs ^^).

    J'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPPER(REGEXP_REPLACE(CONVERT(DWG_NUMBER, 'US7ASCII'), '[^A-Za-z0-9]', ''))
    mais ça ne prend pas en compte les ~. Or on en a pas mal !

    Connaîtriez-vous une solution plus élégante ? D'avance merci !

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With Data as (
      2    Select 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý' as nom from dual
      3  )
      4  Select regexp_replace(
      5           regexp_replace(
      6             regexp_replace(
      7               regexp_replace(
      8                 regexp_replace(
      9                   regexp_replace(
     10                     regexp_replace(
     11                       regexp_replace(
     12                         regexp_replace(Upper(nom), '[[=A=]]','A')
     13                       ,'[[=E=]]','E')
     14                     ,'[[=N=]]','N')
     15                    ,'[[=O=]]','O')
     16                  ,'[[=U=]]','U')
     17                 ,'[[=I=]]','I')
     18               ,'[[=C=]]','C')
     19             ,'[[=Y=]]','Y')
     20           ,'[[=Æ=]]','?') Trans
     21  From Data
     22  /
     
    TRANS
    --------------------------------------------------------
    AAAAAA?CEEEEIIIINOOOOOOUUUUYAAAAAA?CEEEEIIIINOOOOOOUUUUY
     
    SQL>
    Mais, tout ça a l’air d’être terriblement inefficace.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Avec LTRIM , tu enlèves toutes les bons caractères et si le résultat est NOT NULL, c'est que tout est bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DWG_NUMBER, DWG_NUMBER_SIMPLIFIED
    FROM DWG
    WHERE LTRIM(DWG_NUMBER_SIMPLIFIED, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') IS NOT NULL
    ORDER BY DWG_NUMBER;

    C'est une méthode que j'utilise fréquemment pour vérifier si un champ VARCHAR2 ne contient que des chiffres (en vérifiant si le résultat est NULL)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    Par défaut
    Une petite fonction sans prétention...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace function removeAccent (piString varchar2) return varchar2
    is
    c_source constant varchar2 (100) := 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý';
    c_target constant varchar2 (100) := 'AAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaaceeeeiiiinoooooouuuuy';
    begin
      return translate (piString, c_source, c_target);
    end;
    et pour tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select removeAccent('Ülë èst le nöm de mâ côôpïne süèdoìse') from dual;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci à tous pour vos réponses, je me garde ça sous le coude. On a décidé de remettre la résolution de ce problème à plus tard mais tout cela me sera utile quand je m'y remettrais ^^

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/04/2014, 09h28
  2. [RegEx] remplacer tous les caractères accentués d'une chaine
    Par Alexdezark dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2009, 12h47
  3. Réponses: 4
    Dernier message: 02/05/2008, 20h47
  4. Réponses: 3
    Dernier message: 18/02/2008, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo