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

PL/SQL Oracle Discussion :

Trouver une chaîne de caractères


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    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

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    InStr et SubStr

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    Par défaut
    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)

  4. #4
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Je donne la réponse mais j'espère que tu as quand même cherché en début d'après midi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select substr(tonChamp, instr(tonChamp,'/') + 1, length(tonChamp)) from dual;


    Ps : utilises "sélectionner" au lieu de "sélecter" ça fait moins geek

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    merci bcp les amis pour vos reponses je vais les essayer
    Ne pensez pas trop

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  7. #7
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    Voila un bel exemple de code non protégé
    Tu veux parler de ça je suppose.

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Non ...

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  9. #9
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    bah je suis parti du cahier des charges :

    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 ?

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    exemple :
    Colonne = "A/1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  11. #11
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    En effet.

    Quelle solution propre adopter dans ces cas là ?

  12. #12
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  13. #13
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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à )

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    Par défaut
    et le deuxième paramètre du substr n'est pas obligatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  15. #15
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    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

  16. #16
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Utilisez la fonction analytique row_number.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    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

  18. #18
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    c'est très flou comme spécification...

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  19. #19
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 109
    Points : 35
    Points
    35
    Par défaut
    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

  20. #20
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/05/2020, 19h18
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Réponses: 2
    Dernier message: 16/09/2010, 18h29
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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