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 :

Fonctions chaînes de caractères


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Par défaut Fonctions chaînes de caractères
    Bonjour;

    Je cherche des fonctions sql qui permette de récupérer un mot a partir d’une phrase entre le premier et le deuxième espace.

    Exemple :
    2 RUE DE LA REPUBLIQUE ==> je récupérer seulement "RUE"
    2 RUE DE LA REPUBLIQUE ==> je récupérer seulement "DE LA REPUBLIQUE"

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Pour extraire le deuxième "mot" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTR(adresse, INSTR(adresse, ' ') + 1, INSTR(adresse, ' ', 1, 2) - INSTR(adresse, ' ') - 1)
    Pour le reste de l'adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTR(adresse, INSTR(adresse, ' ', 1, 2) + 1)
    Mais ça ne fonctionnera pas pour le "2 bis rue de la république"
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Avec regexp, ce sera probablement plus facile de traiter tous les cas.
    Juste un exemple:

    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
    SQL> with
      2   exemple as (
      3    select '2 RUE DE LA REPUBLIQUE' text from dual union all
      4    select '2 bis RUE DE LA REPUBLIQUE' text from dual union all
      5    select '23bis RUE DE LA REPUBLIQUE' text from dual
      6  ),
      7   expression as (
      8    select '([0-9]+( *bis|ter)?) *([^ ]+) *(.*$)' re from dual
      9  )
     10  select text,regexp_replace(text,re,'\1') "numero",regexp_replace(text,re,'\3') "type voie",regexp_replace(text,re,'\4') "nom voie"   from exemple, expression
     11  /
    TEXT                       numer type nom voie
    -------------------------- ----- ---- --------------------
    2 RUE DE LA REPUBLIQUE     2     RUE  DE LA REPUBLIQUE
    2 bis RUE DE LA REPUBLIQUE 2 bis RUE  DE LA REPUBLIQUE
    23bis RUE DE LA REPUBLIQUE 23bis RUE  DE LA REPUBLIQUE
    Cordialement,
    Franck.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Bravo
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Par défaut
    Bonjour;

    Merci à vous chaleureusement pour votre aide et votre réactivité
    Les deux solutions m'ont apparaît intéressantes, J’arrive bien à gérer la majorité des cas.
    Par contre , Il me reste à gérer les cas suivants avec la deuxième solution, Pouvez vous m'aider ? :

    25-65 RUE DE LA REPUBLIQUE ==> 25-65 / RUE/ DE LA REPUBLIQUE
    25-65 BIS RUE DE LA REPUBLIQUE ==> 25-65 BIS / RUE/ DE LA REPUBLIQUE
    25-65, BIS RUE DE LA REPUBLIQUE==> 25-65 BIS / RUE/ DE LA REPUBLIQUE
    PROMENADE DU PRESIDENT RENE COTY ==> null /PROMENADE/DU PRESIDENT RENE COTY
    ROND POINT DU STADE ==> null /ROND POINT/DU STADE
    L'EMPIRE BOULEVARD DE L AVENIR==> null /L'EMPIRE BOULEVARD/DE L'AVENIR
    LE PARC NOTRE DAME 6 AVENUE DE LA BASILIQUE ==> null /LE PARC/NOTRE DAME 6 AVENUE DE LA BASILIQUE

    Note :NUM VOIE /TYPE VOIE/NOM VOIE
    Merci

  6. #6
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Par défaut fonction en sql qui permette de chercher des mots dans une chaîne de caractères
    Bonjour
    J’ai pensé à une autre manière pour gérer la récupération des différentes colonnes,
    Je suis à la recherche d’une fonction en sql qui permette de chercher des mots dans une chaîne de caractères.
    Exp : dans la chaîne [25-65 BIS RUE DE LA REPUBLIQUE] je vérifie l'existence de l’un des mots : Rue, Boulevard...
    Merci de votre aide

    Cdt

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut,

    Il faut que tu apprennes à utiliser les regexp.
    Cherche de la doc en ligne, par exemple :
    http://www.regular-expressions.info/reference.html

    Puis essaie de comprendre l'exemple que t'a fourni Franck.

    Puis essaie de le tripoter pour y incorporer tes besoins supplémentaires.
    Je suis pas un expert des regexp, mais j'ai bidouillé salement le truc pour tenter d'incorporer les plages d'adresses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH
        exemple AS (
          SELECT '2 RUE DE LA REPUBLIQUE' text FROM dual union ALL
          SELECT '2 bis RUE DE LA REPUBLIQUE' text FROM dual union ALL
          SELECT '23bis RUE DE LA REPUBLIQUE' text FROM dual union all
          select '25-65 RUE DE LA REPUBLIQUE' from dual
        ),
         expression AS (
          SELECT '(([0-9]+(\-[0-9]+)?)( *bis|ter)?) *([^ ]+) *(.*$)' re FROM dual
        )
       SELECT text,regexp_replace(text,re,'\1') "numero",regexp_replace(text,re,'\5') "type voie",regexp_replace(text,re,'\6') "nom voie"   FROM exemple, expression

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Par défaut
    Mon cas est un peu spécial, les adresses qu’on reçoit sur le fichier n’ont pas une forme standard pour savoir au préalable les positions des trois champs à récupérer (je peux avoir : 25-65 BIS RUE DE LA REPUBLIQUE ou ZA LA PIOLINE LOT 37 680 RUE GUILLAUME DU VAIR….)
    J’ai mis en place un algorithme pour gérer les deux champs type de voie et le nom du voie est ça fonctionne.

    Il me reste qu’à gérer le numéro de voie, la règle de gestion est la suivante :
    [Je dois récupérer tous les caractères numériques avant le type de voie]
    Exemple : ZA LA PIOLINE LOT 37 680 RUE GUILLAUME DU VAIR J’ai le type de voie : RUE (je connais déjà sa position 25)
    J’ai le nom de voie : GUILLAUME DU VAIR

    Comment je peux récupérer (37 680 ) tous les caractères numériques avant « RUE » qui est à la position 25 ?
    J’ai essayé avec :
    select regexp_replace('ZA LA PIOLINE LOT 37 680 RUE GUILLAUME DU VAIR', '(([0-9]+(\-[0-9]+)?)( *bis|ter)?) *([^ ]+) *(.*$)', '\25') as num_voie from DUAL; 
    Cdt
    Merci de votre aide !

  9. #9
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Il n'y a pas trop de cas particuliers différents pour que tu puisses tous les traiter ?

  10. #10
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Par défaut
    Bonjour ;

    J’ai essayé avec regexp_substr et j’arrive à gérer le numéro de voie,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select 
    regexp_substr(replace('45-99 RUE DE LA REPUBLIQUE',' ',''), '(([0-9]+(\-[0-9]+)?+(\-[0-9]+)?)( *BIS|ter)?)') 
    FROM DUAL;
    ---Résultat : 45-99

    Par contre j’ai fait plusieurs tentatives pour traiter le cas du 45/45, 45\45, mais j’arrive pas ?
    Y-t-il des choses que j’ai oublié sur l’expression !
    Merci
    Cdt

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 16
    Dernier message: 24/10/2006, 21h37
  3. Réponses: 2
    Dernier message: 15/10/2005, 23h29
  4. Réponses: 5
    Dernier message: 15/02/2005, 18h07

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