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 :

SUBSTR et REGEXP


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut SUBSTR et REGEXP
    Bonjour à tous,

    Je n'arrive pas à trouver la requête qui me permettrait de résoudre le problème suivant.

    J'ai une colonne message_in(CLOB) qui contient 8 champs séparés par des ";"

    0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;
    (notez bien qu'il y a 8 ";" et non pas 7)

    Je souhaiterai ne récupérer que les 4 premiers champs concaténés aux 3 derniers.

    Le problème est double :
    1-Trouver la requête en soi.
    2-Trouver la bonne regexp

    Je tourne autour du pot, mais impossible de finaliser.

    L'idée est de faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CONCAT(
    REGEXP_SUBSTR(TO_CHAR(message_in),'^(([a-zA-Z0-9_ :])*;){4}',1),
    REGEXP_SUBSTR(TO_CHAR(message_in),'^(([a-zA-Z0-9_ :])*;){4}(([a-zA-Z0-9_ :])*;){1}(([a-zA-Z0-9_ :])*;){3}',3)
    )
    PS : si un champ contient un ";" alors tant pis.

    Avez-vous des idées

    Merci à vous

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pourquoi sortir l'artillerie lourde (regexp) alors que SUBSTR et INSTR sont faits pour ça ?

    A voir pour utiliser DBMS_LOB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l, SUBSTR(l, 1, INSTR(l, ';',1, 4)), SUBSTR(l, INSTR(l, ';', -1, 4))
    FROM
    (SELECT '0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;' l
    FROM dual)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L : '0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;'
    SUBSTR(L,1,INSTR(L,';',1,4)) : '0002 ;prov_b;497814;500783500000000;'
    SUBSTR(L,INSTR(L,';',-1,4)) : ';PRT;Wed May 01 04:24:04 CET 1974;6011;'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Effectivement, je m'étais embourbé :-)

    Merci !

    Un oeil neuf est toujours utile.

    Par contre, et même si ce n'est pas la bonne catégorie, quelle serait l'expression régulière pour faire la même chose ?

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    ... quelle serait l'expression régulière pour faire la même chose ?
    Pour un utilisateur dédié on a tenté de chaque fois, simple ou compliquer, verifiier ce qu'on acquiert comme outil reste valable ou pas. Dans ce cas, c'est faisable comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l, regexp_replace(l, '^(([a-zA-Z0-9_ :]*;){4})([a-zA-Z0-9_ :]*;)(([a-zA-Z0-9_ :]*;){3})$','\1\4') r
    FROM
    (SELECT '0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;' l
    FROM dual)
    Et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L
    0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;
    R
    0002 ;prov_b;497814;500783500000000;PRT;Wed May 01 04:24:04 CET 1974;6011;

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Parfait,

    Merci à toi

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La solution de McM sera la plus rapide, mais juste pour "jouer" avec les expressions régulières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with cte_data (str) as
    (
    select '0002 ;prov_b;497814;500783500000000;true;PRT;Wed May 01 04:24:04 CET 1974;6011;' from dual
    )
    select regexp_substr(str, '(.[^;]*;){4}?')                   as L
         , replace(str, regexp_substr(str, '(.[^;]*;){5}?'), '') as R
      from cte_data;
     
    L                                     R
    ------------------------------------  --------------------------------------
    0002 ;prov_b;497814;500783500000000;  PRT;Wed May 01 04:24:04 CET 1974;6011;

Discussions similaires

  1. Substring selon regexp
    Par JamesP dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 16/06/2008, 17h19
  2. [langage] [RegExp] Question d'expression régulière
    Par cloogy dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2003, 09h29
  3. regexp
    Par mathieu gérard dans le forum ASP
    Réponses: 4
    Dernier message: 02/10/2003, 18h05
  4. [sous-chaine] Avec strpos ou substring ??
    Par terziann dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 17/07/2003, 15h28
  5. Réponses: 2
    Dernier message: 10/07/2002, 11h51

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