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 :

Extraire une chaine de caractères dans une colonne


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Extraire une chaine de caractères dans une colonne
    Bonjour à tous,

    J'ai besoin d'extraire des chaines de caractère d'une colonne d'une table. Simplement la difficulté est que la chaine à extraire peut exister en plusieurs exemplaire dans cette même colonne et noyée avec d'autres informations dont je ne dois pas m'occuper.
    La ou les chaînes à extraire est du format :
    'Special MonnaieDeChange Montant' soit par exemple ('Special EUR 0.445')

    J'ai essayé en utilisant des SUBSTR, INSTR etc... et j'obtiens des résultats qui ne me satisfont pas car cela marche pour un cas (si on n'a qu'une fois 'Special EUR 0.445' ) alors qu'il est possible d'en rencontrer plusieurs avec des montants et des monnaies de change différents.

    Exemple dans une même colonne, ce serait sous la forme :
    'Capital repay EUR 0.4 + Special USD 0.67 + Special GBP 0.556'.

    Seuls les chaines 'Special USD 0.67' et 'Special GBP 0.556' sont à détecter et une fois détectées, il faut arriver à extraire chaque montant et chaque monnaie.

    J'espère avoir été assez clair. Je demande votre aide car j'ai passé la journée à tenter ces extractions, hélas sans succès et cela devient urgent.

    Merci par avance pour votre aide.
    Djene

  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
    Quelle est votre version d'Oracle ?

    Edit : Desfois que vous soyez en 10g+, vous pouvez utiliser les expressions régulières.

    Ça pourrait donner quelque chose comme ça, probablement à adapter encore un peu :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    With MaTable as -- Données de départ
    (
    select 1 as cid, 'Capital repay EUR 0.4 + Special USD 0.67 + Special GBP 0.556' as col from dual union all
    select 2       , 'Special EUR 0.445'                                                   from dual union all
    select 3       , 'Special GBP 0.597 + Capital repay EUR 0.4 + Special USD 0.712456'    from dual
    )
      ,  Lst as -- Nombre d'occurences max 
    (
    select max(length(col) - length(replace(col, '+', '')) + 1) as nb_occ
      from MaTable
    )
      , Cpt as -- Génération de nombres de 1 à nb_occurences
    (
        select level as nm
          from Lst
    connect by level <= nb_occ
    )
      ,  Reg as -- Utilisation de regexp pour extraire la partie de la chaîne qui nous intéresse
    (
    select cid
         , nm as pos
         , regexp_substr(col, 'Special [[:upper:]]{3} [[:digit:]]{1}.[[:digit:]]*', 1, nm) as ext
      from MaTable
           cross join Cpt
    )
      select cid -- Mise en forme finale 
           , pos
           , substr(ext, 9, 3) as monnaie
           , substr(ext, 13)   as montant
        from Reg
       where ext is not null
    order by cid asc
           , pos asc;
     
    CID POS MONNAIE MONTANT
    --- --- ------- --------
    1   1       USD 0.67
    1   2       GBP 0.556
    2   1       EUR 0.445
    3   1       GBP 0.597
    3   2       USD 0.712456

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Extraire une chaine de caractère dans une colonne
    Grand merci pour votre aide Waldar! Grace à votre aide, j’ai pu avancer à pas de géant.
    En fait après investigation, le problème s’avère être encore plus simple car dans la dite colonne nous rencontrerons un flot d’informations mais une seule occurrence de ‘Special EUR 0.67’ par exemple et ce sera juste celui là qu’il faudra extraire. J’ai réussi à modifier votre code et j’ai obtenu le résultat escompté. Simplement, à présent je ne sais comment implémenter tout ceci dans mon code d’origine.
    A savoir, il s’agit d’interpréter une colonne particulière lors de chargements de données vers une table temporaire (table TOTO). C'est-à-dire que une fois les données brutes insérées dans TOTO, après transformation, il me faut insérer les résultats dans 3 autres colonnes de cette même table TOTO.

    La table TOTO est composée de différentes colonnes (col1, col2, col3, col4, col5, col6 ….). Disons que c’est la col2 qui contiendra l’information brute : ‘Special EUR 0.67’.
    1/ C’est de cette col2 qu’il me faut récupérer (en appliquant la solution que vous m’avez donné) l’information monnaie et l’information montant afin de renseigner la col3 avec ‘EUR’ et la col4 avec le montant 0.67.

    2/ Autre difficulté, en même temps, le montant 0.67 doit être transformé (en lui appliquant un taux de change USD par ex.) et le résultat inséré dans col5.

    Je vous remercie encore une fois d’avance pour votre précieuse aide.
    Je reviens dans le code après plusieurs années et j’ai du mal en ce moment.
    Votre aide me sera donc très précieuse.

    Encore grand merci !

  4. #4
    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
    Je comprends à peu près ce que vous voulez faire, mais je ne le comprends pas précisément.
    Si vous pouviez illustrer de quelques lignes d'exemples, avec les données sources, la ou les étapes qui construisent toto, ainsi que la finalité puisque toto est un étape intermédiaire !

  5. #5
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Djene, je m'excuse pour l'intervention.
    j'ai quelque chose à vous(forumistes) dire.
    j'avoue que Waldar est maitre de SQL avec cette magique requete.

  6. #6
    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
    Merci boussafi, c'est surtout de la pratique et de la bonne lecture !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut Extraire une chaine de caractère dans une colonne
    Bonjour,

    Je vais tenter d'être plus précise.
    TOTO est donc une table temporaire de la base oracle comportant plusieurs colonnes qui seront renseignées via le chargement batch de différents fichiers. Les fichiers d'origine sont des fichiers xls ayant des colonnes à l'image de TOTO. La col2 existe donc dans le fichier et son contenu (par ex. 'Capital EUR 0.444 + Special EUR 0.67') sera téléchargé à l'identique dans la col2 de la table TOTO.
    Après la fin du téléchargement, on sait que l'info ' Special EUR 0.67 ' de la col2, est à extraire si la col1 de TOTO contient l'information 'SPEC_DIV'.

    Les données extraites de col2 (c'est à dire la monnaie 'EUR' et le montant '0.67') seront insérées dans la col3 et col4 de TOTO, colonnes restées vides après le téléchargement batch des fichiers.
    Au montant de '0.67' on applique un taux de change en USD. Le résultat du calcul sera inséré dans la col6 de TOTO.

    Dans la col5 de TOTO, sera inséré le résultat du calcul du montant '0.67' transformé (car on lui aura appliqué le taux de change permettant de passer de 0.67 EUR à un montant USD).

    Illustration chargement des données du fichier dans les colonnes de TOTO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Insert into TOTO (col1, col2, col3, col4, col5, col6...) as select (col1, col2, col3, col4, col5, col6 ...) from fichiers
    Une fois chargement dans TOTO ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Si col1 contient l'info 'SPEC_DIV'
    alors rechercher la chaine de caractère ' Special EUR 0.67 ' dans col2,
    extraire de cette chaine la monnaie 'EUR' et le montant '0.67' et les insérer dans col3 et col4 réciproquement
    Appliquer taux et insérer dans col5 de TOTO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    avant d'insérer le montant '0.67', lui appliquer le taux de change en USD et insérer le résultat du calcul dans la col5 de TOTO
    J'espère que c'est un peu plus clair ainsi.
    Encore merci pour tout.

  8. #8
    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
    En fait que je pense que toute votre table TOTO n'est pas utile.
    Tout ce que vous voulez récupérer vous pouvez l'obtenir avec une seule requête SQL qui pointerait directement sur votre fichier.

    Néanmoins si pour certaines raisons vous devez garder votre table temporaire, ce que je peux comprendre, pour créer différents niveaux n'analyse il vaut mieux avoir plusieurs tables qu'on rempli par étape plutôt qu'une seule qu'on met à jour, et ce sera d'autre plus vrai que vous avez beaucoup de données.

    Est-ce que vous avez une table de référence des monnaies et une autre avec les taux de change ?

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

Discussions similaires

  1. [AC-2010] remplacer une chaine de caractère dans une colonne
    Par ambact dans le forum VBA Access
    Réponses: 9
    Dernier message: 09/08/2012, 21h43
  2. [MySQL] Récupérer une chaine de caractère dans un colonne
    Par djdamage dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/07/2009, 15h40
  3. Réponses: 2
    Dernier message: 31/01/2008, 17h58
  4. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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