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 :

Comment convertir les caractères [A-Z] en chiffre [10..35] ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Comment convertir les caractères [A-Z] en chiffre [10..35] ?
    Bonjour,

    Je voudrais convertir les caractère [A-Z] en chiffre au sein d'une chaine de caractère contenant à la fois des lettres et des chiffres.

    La conversion doit suivre la règle suivante :
    A-->10
    B-->11
    ...
    Z-->35

    Exemple : avec la chaine suivante A123B456C79D

    Le résultat serait le suivant 1012311456127913

    J'ai essayé avec la fonction REGEXP_REPLACE sans succès.
    REGEXP_REPLACE(myChar, '([[:alpha:]])', to_char(10 + ascii('\1') - 65))

    J'ai aussi essayé avec la fonction translate mais ca ne fonctionne pas car cette méthode permet de remplacer un caractère par un seul caractère. Or je veux par exemple remplacer A en 10 (soit 2 caractères).

    Auriez-vous une idée ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Comme ceci ça fonctionne, mais je ne sais pas si c'est très performant :
    Code sql : 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
    with sr as
    (
    select 'A123B456C79D' as word
      from dual
    )
      ,  ct as
    (
        select word,
               level as pos,
               substr(word, level, 1) as lettre,
               case
                 when ascii(substr(word, level, 1)) between 65 and 90
                 then to_char(ascii(substr(word, level, 1))-55)
                 else substr(word, level, 1)
               end as new_letter
          from sr
    connect by level <= length(word)
    )
      select word,
             replace(replace(XMLAgg(XMLElement("x", new_letter) ORDER BY pos ASC), '<x>', ''), '</x>', '') AS new_word
        from ct
    group by word;
     
    WORD		NEW_WORD
    A123B456C79D	1012311456127913
    Une fonction PL/SQL serait peut-être plus adaptée.

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Tu peux également faire très laid et imbriquer tes regexp_replace...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REGEXP_REPLACE(REGEXP_REPLACE(myChar, 'a', 10)), 'b', '11')
    (etc)

    (et du coup, ça peut se faire avec un simple replace )

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Bonjour,

    J'avais posé la même question sur le forum Oracle et on m'a proposé plusieurs solutions dont celle-ci qui me convient parfaitement.

    C'est un peu une astuce mais très efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select translate(
                  regexp_replace(
                    regexp_replace(
                      regexp_replace('LA CHAINE A CONVERTIR','([A-J])','1\1')
                      ,'([K-T])','2\1')
                    ,'([U-Z])','3\1') 
                  ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','01234567890123456789012345')        
    from DUAL
    Pour visualiser les autres solutions, voir le sujet suivant :
    http://forums.oracle.com/forums/thre...2876&tstart=15

    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] comment convertir les chiffres en lettres sous excel ?
    Par atlaslion dans le forum Excel
    Réponses: 3
    Dernier message: 26/06/2015, 12h54
  2. Réponses: 5
    Dernier message: 19/07/2014, 13h50
  3. je cherche comment convertir les chiffres en lettre
    Par 21247692 dans le forum Développement
    Réponses: 3
    Dernier message: 06/10/2009, 12h21
  4. Réponses: 6
    Dernier message: 06/03/2005, 19h47

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