Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2011, 10h28   #1
Invité de passage
 
Homme
Consultant E-Business
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant E-Business
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 0
Points : 0
Par défaut Extraction caractère en commençant par la droite

Bonjour à tous.

Je souhaite faire une extraction sur une chaine de caractères :

Ma chaine de caractères contient plusieurs points :

123DC76.3664GDTE.2ZSD.4ESZ2
12ZSE34.12Z.SZ34.32ZSEZ32.32ZSE45

Mon but est d’extraire (dans des variables par exemple) les caractères qui se trouvent après le dernier point puis les caractères qui se trouvent entre l’avant dernier point et le dernier point puis dans un dernier temps tous les caractères qui se trouvent avant l’avant dernier point.

J’espère avoir été claire, merci pour votre aide.
zakporcinet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 10h02   #2
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
je ne pense pas qu'elle est possible en sql, il te faut une procedure.
mais en general, pour extraire des caracteres de droite à gauche voici la fonction selon le SGBD utilisé.

fonction_de_extraction(la_chaine,longueur(la_chaine)-N,longueur_(la_chaine))
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 18/09/2011, 12h27   #3
Membre du Club
 
nancy carina
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations personnelles :
Nom : nancy carina

Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 45
Points : 45
Citation:
Envoyé par boussafi Voir le message
je ne pense pas qu'elle est possible en sql, il te faut une procedure.
bah si, s'il est sous Oracle, avec les fonctions SUBSTR et INSTR
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SQL> SELECT substr('aaa.bbbb.ccc',INSTR('aaa.bbbb.ccc','.',-1)+1) FROM dual; 
 
SUB
---
ccc
 
SQL> SELECT substr(substr('aaa.bbbb.ccc',INSTR('aaa.bbbb.ccc','.')+1),1,(INSTR(substr('aaa.bbbb.ccc',INSTR('aaa.bbbb.ccc','.')+1),'.',-1)-1)) FROM dual; 
 
SUB
----
bbbb
 
SQL> SELECT substr('aaa.bbbb.ccc',1,INSTR('aaa.bbbb.ccc','.',-1,2)-1) FROM dual;
 
SUB
---
aaa
nancy_carina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 16h41   #4
Rédacteur
 
Inscription : décembre 2002
Messages : 2 387
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 387
Points : 3 272
Points : 3 272
Autre petite variante pour la partie intermédiaire ;

Code :
1
2
3
4
5
6
7
8
9
WITH test AS
    (SELECT '123DC76.3664GDTE.2ZSD.4ESZ2' val FROM dual
    union
    SELECT '12ZSE34.12Z.SZ34.32ZSEZ32.32ZSE45' val FROM dual)
SELECT     val,
        substr(val, instr(val, '.', -1, 1)+1) fin, 
        substr(val, instr(val, '.', -1, 2)+1, instr(val, '.', -1, 1) - instr(val, '.', -1, 2)) milieu,
        substr(val, 1, instr(val, '.', -1, 2)) debut
FROM test;
Code :
1
2
3
4
5
 
VAL                                 FIN             MILIEU          DEBUT
----------------------------------- --------------- --------------- ------------------------------
123DC76.3664GDTE.2ZSD.4ESZ2         4ESZ2           2ZSD.           123DC76.3664GDTE.
12ZSE34.12Z.SZ34.32ZSEZ32.32ZSE45   32ZSE45         32ZSEZ32.       12ZSE34.12Z.SZ34.
Mais on a beau se contorsionner au niveau du formatage, ces imbrications de fonctions ont vite fait d'être illisibles...
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 09h28   #5
Invité de passage
 
Homme
Consultant E-Business
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant E-Business
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 0
Points : 0
ça fonctionne super bien !!

Merci.
zakporcinet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h29   #6
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Une solution plus évolutive à mon sens serait d'utiliser REGEXP

Si tu es en 10g ou plus :

Code :
1
2
3
4
5
6
7
8
WITH test 
AS
  (
   SELECT  '123DC76.3664GDTE.2ZSD.4ESZ2'   str FROM dual  
   )
SELECT ROWNUM, regexp_substr (str, '[^.]+', 1, rownum) split 
  FROM test 
connect BY level <= length (regexp_replace (str, '[^.]+'))  + 1
En l'encapsulant dans une fonction avec en entrée la chaine et le caractere de séparation et en sortie un tableau donnant les chaines et leurs positions ( derniere , avant derniere , etc .. )
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h12.


 
 
 
 
Partenaires

Hébergement Web