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 :

Enlever les caractères non A-Z 0-9 d'une chaine


Sujet :

SQL Oracle

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Enlever les caractères non A-Z 0-9 d'une chaine
    Bonjour,

    Il s'agit de créer un nom table (et ultérieurement une table) à préfixe fixe de 13 caractères, on a donc à lui concaténer une chaine qui ne doit donc pas dépasser 17 caractères (13 + 17 = 30, la limite conventionnelle)
    Mais le problème c'est que cette suffixe additionnelle est obtenue à partir d'une chaine qui peut-être plus longue, contenant espace et accents:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION WITHOUT_FORMAT_STR(varchar2 v_ClassStr)
    RETURN varchar2
    BEGIN
    	--return SUBSTR(v_ClassStr, 1, 17);
    END;
    Comment alors parcourir chaque caractère d'une chaine en Oracle Sql pour lui enlever les espaces et accentuations (ainsi que cédille, etc.)?

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Salut,

    Si tu es en 10g+, tu peux aller faire un tour du côté des expressions régulières (une petite recherche google avec 'REGEXP + ORACLE' devrait t'aider, par exemple http://www.adp-gmbh.ch/blog/2005/december/22.html).

    Sinon en 10g-, obliger de faire du cas par cas je crois bien.

    Par contre t'aurais du poster dans la section PL/SQL...

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous pourriez vous inspirer d'un algo de ce type:

    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
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Productio
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.5.0 - Production
     
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2    LC$Ko   VARCHAR2(100) := 'éèàçù0123456789,;:!§/.?&_%ù¨^/*-+&"''(-_)={[|`\^@]}';
      3    LC$Ok   VARCHAR2(100) := 'eeacu';
      4    LC$Res VARCHAR2(100);
      5  BEGIN
      6    LC$Res := TRANSLATE('123acfgtàé23',LC$Ko ,LC$Ok);
      7    DBMS_OUTPUT.PUT_LINE(lc$res);
      8  END;
      9  
     10  
     11  /
    acfgtae
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    A l'avenir, merci d'indiquer systématiquement les versions utilisées

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Si c'est pour supprimer (et pas remplacer) les caractères comme dit dans le titre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t.chaine, TRANSLATE(t.chaine, 
    'a'|| TRANSLATE(t.chaine, '!ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', '!'), 'a') as result
    FROM
    	(SELECT '123acfgtàé23' AS chaine FROM dual) T
     
    Chaine              result
    123acfgtàé23     123acfgt23

  5. #5
    Lucas Panny
    Invité(e)
    Par défaut
    Je suis sous ORACLE 9i

    Le code de McM c'est ce que j'avais pensé et voici son utilisation dans ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE FUNCTION WITHOUT_FORMAT_STR(v_ClassStr varchar2)
    RETURN varchar2
    AS
    v_Str varchar2(1000);
    BEGIN
      v_Str := TRANSLATE(v_ClassStr, 
    'a'|| TRANSLATE(v_ClassStr, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_', ' '), 'a');
    	return UPPER(SUBSTR(v_Str, 1, 17));
    END;
    Mais après analyse, c'est pas très ergono! En fait, ce que je cherche donc c'est remplacer mais pas supprimer (enlever)

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    remplacer par quoi ? (Voyez ma solution)

  7. #7
    Lucas Panny
    Invité(e)
    Par défaut
    Votre solution semble la solution mais je ne sais pas comment l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SET SERVEROUTPUT ON
     
    DECLARE
        LC$Ko   VARCHAR2(100) := 'éèàçù,;:!§/.?&_%ù¨^/*-+&"''(-_)={[|`\^@]}';
        LC$Ok   VARCHAR2(100) := 'eeacu';
        LC$Res VARCHAR2(100);
    BEGIN
        LC$Res := TRANSLATE('123acfgtàé23',LC$Ko ,LC$Ok);
        DBMS_OUTPUT.PUT_LINE(lc$res);
    END;
    Je ne connais pas les variables avec des $ à l'intérieur??

  8. #8
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ce sont des variables comme les autres. Le caractère $ n'est pas interdit dans un nom de variable Appelez-les var1 et var2 si vous préférez...

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Bonjour SheikYerbouti,

    J'en profite pour vous demander si pour nommer vos variables, vous suiviez une convention de nommage particulière, ou si c'était la votre que vous avez élaborée au fil du temps.

  10. #10
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Il s'agit d'une convention élaborée il y a plus de 10 ans...

    Le premier caractère indique la portée:
    G (global - dans le cadre d'une package)
    P (paramètre passé en argument)
    L (local à la procédure)

    Le deuxième caractère indique le type (un peu à la notation hongroise)
    N numérique
    I Integer
    C char
    D date
    B booléen
    R record
    T table

    le $ est le séparateur.
    Ce qui suit correspond au nom de la variable

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    merci pour cette précision qui améliore nettement la lisibilité du code quand on la connait

  12. #12
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Votre solution semble la solution mais je ne sais pas comment l'utiliser
    Nous remplaçons les caractères contenus dans LC$Ko par ceux contenus dans LC$Ok. Les caractères qui n'ont pas de correspondance sont éliminés.

  13. #13
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Il s'agit d'une convention élaborée il y a plus de 10 ans...
    Inspirant, moi j'utilise:
    v_sQuelqueChose varchar2 (100) = LC$QuelqueChose
    v_cXxx char (1) = LC$Xxx
    a_* = P*
    g_* = G*
    c_nAbc constant number (1) = CN$ (?)
    ....

    Le sens est analogue...

  14. #14
    Lucas Panny
    Invité(e)
    Par défaut
    Le problème avec ce code c'est que mon résultat est: (SQL*Plus Worksheet)

    old 2: LC$Ko VARCHAR2(100) := 'éèàçù0123456789,;:!§/.?&_%ù¨^/*-+&"''(-_)={[|`\^@]}';
    new 2: LC$Ko VARCHAR2(100) := 'éèàçù0123456789,;:!§/.?SET SERVEROUTPUT ON%ù¨^/*-+&"''(-_)={[|`\^@]}';
    acfgtae

    PL/SQL procedure successfully completed.

    Enter value for _:

  15. #15
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Il faut faire SET SCAN OFF en début de session Sql*Plus.

    Maintenant, sachez que vous pouvez également regrouper tout ceci en une simple instruction SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select translate( colonne, 'éèàçù0123456789,;:!§/.?&_%ù¨^/*-+&"''(-_)={[|`\^@]}', 'eeacu' ) from la_table

  16. #16
    Lucas Panny
    Invité(e)
    Par défaut
    OK merci c'est vraiment ce qui me fallait

Discussions similaires

  1. [PL/SQL] Supprimer les caractères non numériques
    Par Oliveuh dans le forum PL/SQL
    Réponses: 6
    Dernier message: 25/06/2015, 12h13
  2. enlever les caractères non numériques
    Par Issam dans le forum SQL
    Réponses: 2
    Dernier message: 06/02/2015, 16h07
  3. Enlever les caractères de bourrages
    Par boux2 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2006, 12h07
  4. [C#][ADO] Enlever les caractère spéciaux
    Par Oberown dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/01/2005, 18h38

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