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 :

Extraction de chaines numériques d'un VARCHAR


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Par défaut Extraction de chaines numériques d'un VARCHAR
    Bonjour,

    Dans une procédure PL SQL, j'ai une variable de type VARCHAR qui ressemble à ça :

    "blabla 1234 blablabla 123 blabla 4567 blabla"

    Mon but est d'en extraire toutes les chaines numériques :
    1234
    123
    4567

    De façon à pouvoir faire une boucle sur ces chaines pour tester certaines propriétés.

    J'y parviens, mais avec une fonction très lourde et inélégante Existe-t-il une astuce pour le faire simplement ?

  2. #2
    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
    Y'a rien de prévu nativement.
    Comment tu boucles ?

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    avec un translate ça devrait se faire facilement. Tu remplaces tout ce qui n'est pas un chiffre en espace et tu extraits les nombres avec des INSTR

  4. #4
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par orafrance
    avec un translate ça devrait se faire facilement. Tu remplaces tout ce qui n'est pas un chiffre en espace et tu extraits les nombres avec des INSTR

    Tu peux meme faire mieux apres non ?
    genre en remplacant 2 espaces par un seul ( ainsi tu as une chaine "formatée")

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut,

    Adaptes ce code à ton besoin.

    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
     
    CREATE OR REPLACE PACKAGE extraire_nb_pkg IS
    TYPE outrecset IS TABLE OF number;
    FUNCTION extraire_nb (v_chaine IN VARCHAR2)
    RETURN outrecset PIPELINED;
    END extraire_nb_pkg;
    --Package body 
    CREATE OR REPLACE PACKAGE BODY scott.extraire_nb_pkg
    IS
       FUNCTION extraire_nb (v_chaine IN VARCHAR2)
          RETURN outrecset PIPELINED
       IS
          v_number   NUMBER;
          i          NUMBER := 1;
       BEGIN
          LOOP
             SELECT REGEXP_SUBSTR (v_chaine, '[[:digit:]]+{1,10}', 1, i)
               INTO v_number
               FROM DUAL;
     
             PIPE ROW (v_number);
             EXIT WHEN v_number IS NULL AND i > 1;
             i := i + 1;
          END LOOP;
     
          RETURN;
       END;
    END extraire_nb_pkg;
    /
    Le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> select * from table(extraire_nb_pkg.extraire_nb('blabla 1254 hdghjdgh 12546 hjggsdh 12547 sdvjs
     '));
     
    COLUMN_VALUE
    ------------
            1254
           12546
           12547

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Par défaut
    Ca m'a l'air nickel cette fonction, mais je crois que REGEXP_SUBSTR ne fonctionne qu'à partir d'Oracle 10, ce sera dans quelques mois en ce qui me concerne En tout cas c'est bon à savoir.

    Sinon pour l'idée précédente, si j'ai bien compris il faut transormer

    "blabla 1234 blablabla 123 blabla 4567 blabla"

    en

    " 1234 123 4567 "

    Mais ensuite comment je fais pour boucler sur ces trois nombres ? (j'ai besoin pour chacun d'entre eux de tester leur valeur et selon les cas les mémoriser dans une variable). Je ne vois pas trop comment procéder avec des INSTR.

  7. #7
    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
    Citation Envoyé par orafrance
    avec un translate ça devrait se faire facilement. Tu remplaces tout ce qui n'est pas un chiffre en espace et tu extraits les nombres avec des INSTR
    C'est ce à quoi j'avais pensé mais si tu as ceci :
    "blabla 1234 blabla 5678 bla9bla"
    tu te retrouves avec "1234 5678 9"

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH t AS (
      SELECT TRIM(TRANSLATE('blablabla 1234 blajafiojz 5678 bla9bla', ' ' || TRANSLATE('blablabla 1234 blajafiojz 5678 bla9bla', 'a 0123456789', 'a'), ' ')) AS c
    	FROM dual
       )
      SELECT DISTINCT extractvalue(COLUMN_VALUE,'/x')
      FROM t,
     TABLE(xmlsequence(EXTRACT(XMLTYPE('<list><x>'||REPLACE(c,' ','</x><x>')||'</x></list>'),
          '/list/x')))
    WHERE extractvalue(COLUMN_VALUE,'/x') IS NOT NULL

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

Discussions similaires

  1. Extraction d'une sous chaine numérique
    Par ouinih dans le forum PL/SQL
    Réponses: 4
    Dernier message: 10/02/2009, 10h29
  2. Extraction de chaine de caractères
    Par asterix76-rouen dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 23h17
  3. Extraction de chiffres d'un champs VARCHAR vers un NUM
    Par midnight77 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/11/2004, 10h52
  4. [XSLT] Extraction de chaine de caractere
    Par Hugo001 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 28/10/2004, 08h27

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