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 :

[Oracle 19C] Rechercher la dernière occurence d'un caractère dans une chaine de données


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut [Oracle 19C] Rechercher la dernière occurence d'un caractère dans une chaine de données
    Bonjour,

    j'ai une table qui contient un champ sur lequel je souhaiterais "splitter" le texte.
    Ainsi, j'aimerais couper ma chaîne de caractère à l'endroit où le dernière chiffre est saisi.

    j'ai bien pensé à utiliser instr() ou substr() mais je ne sais pas comment
    - faire pour y spécifier l'ensemble des chiffres possibles (0 à 9)
    - extraire d'une part les caractères depuis le début de la chaîne jusqu'à la position du dernier caractère de type numérique (inclus)
    - extraire d'autre part les caractères depuis la position juste après le dernier caractère de type numérique jusqu'à la fin de la chaîne de caractères

    Voici des données exemples pour mieux comprendre ce que je souhaite faire.
    A partir du champ MON_CHAMP, je souhaite déterminer le contenu de DEBUT_CHAMP et de FIN_CHAMP.

    MON_CHAMP DEBUT_CHAMP FIN_CHAMP
    EAA++00ABR EAA++00 ABR
    E15++08TRE E15++08 TRE
    T15++08RE T15++08 RE
    RTEC+982UI RTEC+982 UI
    Z891++1TRATRIE Z891++1 TRATRIE


    Merci beaucoup.
    MarieO

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 571
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Les blancs ajoutés dans la deuxième ligne pour C2 sont volontaires, c'est ce qui justifie la fonction TRIM() au cas où

    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
    with T1(C1, C2) as
        (select 1, 'EAA++00ABR'     from dual union all
         select 2, 'E15++08TRE '    from dual union all
         select 3, 'T15++08RE'      from dual union all
         select 4, 'RTEC+982UI'     from dual union all
         select 5, 'Z891++1TRATRIE' from dual
        )
      , T2(C1, C2, L2, R2) as  
        (select C1
              , C2
              , length(trim(C2))
              , regexp_instr(reverse(trim(C2)), '0|1|2|3|4|5|6|7|8|9|0', 1) 
         from T1
        )
    select C1
         , C2
         , substr(C2, 1, L2-R2+1) as Deb
         , substr(C2, L2-R2+2, 10) as Fin
    from T2
    ;


    Résultat :

    Nom : Sans titre.png
Affichages : 68
Taille : 7,0 Ko


    Note : parler de "champ" est un abus de langage. Dans une base relationnelle, il n'y a pas de champs, mais des colonnes. Les champs sont des zones de saisie d'un formulaire ou les zones de restitution d'un état.

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 169
    Par défaut
    Bonjour,

    Ce genre d'extractions est plus facile en utilisant les fonctions regexp en effet:

    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
    with T(mon_champ) as
        (select 'EAA++00ABR'     from dual union all
         select 'E15++08TRE '    from dual union all
         select 'T15++08RE'      from dual union all
         select 'RTEC+982UI'     from dual union all
         select 'Z891++1TRATRIE' from dual
    )
    select mon_champ,
           regexp_substr(mon_champ, '^(.+[[:digit:]])[^[:digit:]]+$', 1, 1, 'i', 1) debut_champ,
           regexp_substr(mon_champ, '^.+[[:digit:]]([^[:digit:]]+$)', 1, 1, 'i', 1) fin_champ
    from t; 
     
    MON_CHAMP      DEBUT_CHAMP    FIN_CHAMP     
    -------------- -------------- --------------
    EAA++00ABR     EAA++00        ABR           
    E15++08TRE     E15++08        TRE           
    T15++08RE      T15++08        RE            
    RTEC+982UI     RTEC+982       UI            
    Z891++1TRATRIE Z891++1        TRATRIE

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut
    Bonjour à tous les 2,

    Merci beaucoup pour ces codes qui fonctionnent à merveille.

    Effectivement, les expressions régulières font merveilleusement le travail.

    MarieO

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 571
    Billets dans le blog
    10
    Par défaut
    Ce qui est amusant avec le SQL, c'est qu'il y a rarement une seule solution

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Quand il y a plusieurs solutions, c'est utile de faire des tests de montée en charge

    Test 1 : exécuter n fois chaque requête avec le même jeu de résultat ; et comparer
    Test 2 : Faire varier de manière logarithmique le nombre de ligne (attention à garder un œil sur la dispersion des cas)

    Et une fois qu'on s'est fait une idée, chercher à voir si des index partiels/calculés peuvent être utiles
    Le savoir est une nourriture qui exige des efforts.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 571
    Billets dans le blog
    10
    Par défaut
    Ça va sans dire, c'est la raison pour laquelle les performances d'une requête sur une plate-forme X ne sont pas toujours les mêmes que les performances de cette même requête sur une plate-forme Y.

    Cas d'espèce : la plate forme de tests unitaires, dont les données représentent le plus souvent un simple échantillon peu volumineux et la plate-forme de production en volume réel. Il est fréquent que la stratégie d'accès choisie par l'optimiseur pour exécuter la même requête soit différente, statistiques obligent

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

Discussions similaires

  1. Réponses: 38
    Dernier message: 23/02/2008, 01h59
  2. Réponses: 6
    Dernier message: 14/08/2007, 16h44
  3. Occurences d'un caractère dans une chaîne
    Par meadup dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/01/2007, 18h49
  4. Premiere occurence d'un entier dans une chaine
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h04
  5. Compter les occurences d'un car dans une chaine/variable
    Par sherlockfr dans le forum Windows
    Réponses: 2
    Dernier message: 10/11/2005, 07h48

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