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 23/05/2011, 12h57   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 4
Points : 4
Par défaut Trouver une chaîne de caractères

bonjour tout le monde,
J'ai un probleme pour la detection d'une chaine de caractere.
Je vais selecter par exemple un champs qui contient les donnees comme suit:
xxxxx/1
xxxxx/2
yyyy/1
yyyy/1
je veux la fonction qui detecte le caractere qui existe aprés le "/"

si quelqu'un peut m'aider je serai reconnaissante
et merci bcp
__________________
Ne pensez pas trop
brajae85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h57   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
InStr et SubStr
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/05/2011, 13h58   #3
Membre du Club
 
AC
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations personnelles :
Nom : AC
Âge : 43
Localisation : Suisse

Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 48
Points : 48
Bonjour,

L'instruction INSTR va vous permettre de trouver la position du / et
l'intruction SUBSTR va vous permettre d'extraire "le morceau" de la chaîne souhaitée...

A disposition si problème(s)
wahnfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h28   #4
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
Je donne la réponse mais j'espère que tu as quand même cherché en début d'après midi

Code :
SELECT substr(tonChamp, instr(tonChamp,'/') + 1, length(tonChamp)) FROM dual;


Ps : utilises "sélectionner" au lieu de "sélecter" ça fait moins geek
macben est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/05/2011, 15h55   #5
Invité de passage
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 4
Points : 4
merci bcp les amis pour vos reponses je vais les essayer
__________________
Ne pensez pas trop
brajae85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h14   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par macben Voir le message
Je donne la réponse mais j'espère que tu as quand même cherché en début d'après midi

Code :
SELECT substr(tonChamp, instr(tonChamp,'/') + 1, length(tonChamp)) FROM dual;


Ps : utilises "sélectionner" au lieu de "sélecter" ça fait moins geek
Voila un bel exemple de code non protégé
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h29   #7
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
Citation:
Envoyé par Yanika_bzh Voir le message
Voila un bel exemple de code non protégé
Tu veux parler de ça je suppose.
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h43   #8
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Non ...

Imaginons que "/" n'existe pas dans votre colonne, que va vous retourner

Code :
substr(tonChamp, instr(tonChamp,'/') + 1, length(tonChamp))
De plus votre va au dela de la taille réelle de votre colonne.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h54   #9
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
bah je suis parti du cahier des charges :

Citation:
Je vais selecter par exemple un champs qui contient les donnees comme suit:
xxxxx/1
xxxxx/2
yyyy/1
yyyy/1
je veux la fonction qui detecte le caractere qui existe aprés le "/"
Après (enfin avant chronologiquement) je suppose que le contrôle de l'existence du "/" a été fait.

Et je ne comprend pas pourquoi/comment le length(champ) irait au-delà de la taille réelle de ma colonne ?
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h10   #10
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
exemple :
Colonne = "A/1"
Code :
Substr(colonne,instr(colonne,'/')+1, length (colonne))
Equivaut donc a

Or vous n'avez pas 3 caracteres apres votre "/". ORACLE permet de le faire, mais ce n'est absolument pas propre...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h16   #11
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
En effet.

Quelle solution propre adopter dans ces cas là ?
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h19   #12
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
faire un différentiel
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h22   #13
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
Genre :

Code :
SELECT substr('a/1', instr('a/1','/') + 1, length('a/1') - instr('a/1','/')) FROM dual;
(ps : ça fait un peu jeu de piste ton truc là, 4 messages de ta part pour arriver à sortir ce que tu veux nous dire c'est un peu de la pollution de post là )
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h30   #14
Membre du Club
 
AC
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations personnelles :
Nom : AC
Âge : 43
Localisation : Suisse

Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 48
Points : 48
et le deuxième paramètre du substr n'est pas obligatoire :

Code :
SELECT substr('cou/cou',instr('cou/cou','/')+ 1) FROM dual;
et si le / n'est pas trouvé... et bien cela dépend de ce que l'on veut faire...
wahnfried est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 11h26   #15
Invité de passage
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 4
Points : 4
Merci bcp les amis pour vas reponse et surtt "macben" votre solution a bien marché

une remarque tt les champs selectionner contient le "/" donc pas de probleme.
j'ai une autre question si c'est possible: " nom caractere retourner est un nombre je veux faire un auto-increment pour ces nombre retourner.
c'est à dire par exemple mes chaine etait "REF67887/3" , "REF67823/3","REF67899/3"
le code donner il va retourner :
3
3
3
Alors moi je veux incrementer ces nombre de tel façon qu'il donne
3
4
5
j'espere que mon problème est claire, et merci beaucoup pour vos reponses qui m'ont vraiment débloqué.
__________________
Ne pensez pas trop
brajae85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h37   #16
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Utilisez la fonction analytique row_number.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h16   #17
Invité de passage
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 4
Points : 4
Merci "mnitu" pour ta reponse, mais je crois le row_number va filtrer les enregistrement retourner selon un interval donné!
Mais mon probleme c'est de pouvoir incrementer les enregistrements retournés,
comme c'est deja expliqué.
et merci
__________________
Ne pensez pas trop
brajae85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h29   #18
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
c'est très flou comme spécification...

jette un oeil sur le code ci-dessous, peut-être ça t'aidera

Code :
1
2
3
4
5
6
7
WITH t AS (SELECT value(n) x FROM TABLE(sys.odcivarchar2list(
  'xxxxx/1','xxxxx/2','yyyy/1','yyyy/1','REF67887/3' , 'REF67823/3','REF67899/3'))n)
SELECT x, 
  regexp_substr(x,'\w+',1,2) str2, 
  regexp_substr(x,'\w+',1,2)+
    row_number() over (partition BY regexp_substr(x,'\w+',1,2) ORDER BY 1)-1 i 
FROM t;
Code :
1
2
3
4
5
6
7
8
9
X                    STR2          I
-------------------- ---- ----------
xxxxx/1              1             1
yyyy/1               1             2
yyyy/1               1             3
xxxxx/2              2             2
REF67899/3           3             3
REF67887/3           3             4
REF67823/3           3             5
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 13h11   #19
Invité de passage
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 4
Points : 4
Merci bcp "laurentschneider" vous etes fort
je vais profiter un peu de votre expertise et faire une derniere demande pour arriver à mon but
voila, mon but c'est d'avoir deux parti de la chaine 'xxxx/1' avoir 'xxxx/' et le nombre 1 que je vais incrementer ( votre code repond exactement à la duxieme partie)
et concaténer les deux aprés incrementation comme suit:
X X1 N N1 X3
XX/1 XX/ 1 1 XX/1
XX/1 XX/ 1 2 XX/2
yy/3 yy/ 3 3 yy/3
yy/3 yy/ 3 4 yy/4

et merci bcp
__________________
Ne pensez pas trop
brajae85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h44   #20
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
Code :
1
2
3
4
5
SELECT x, 
  regexp_substr(x,'\w+/')||  
  (regexp_substr(x,'\w+',1,2)+
    row_number() over (partition BY regexp_substr(x,'\w+',1,2) ORDER BY 1)-1 ) x2 
FROM t;
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h08.


 
 
 
 
Partenaires

Hébergement Web