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 :

Incrémenter des nombres dans une chaîne


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut Incrémenter des nombres dans une chaîne
    Bonjour,

    J'ai une chaîne de caractère composée de texte et chiffres exemple :
    Programme 2011 diplômée 2013.

    J'aimerai obtenir :
    Programme 2012 diplômée 2014.

    soit incrémenter de 1 tous les nombres de ma chaine.

    Quelqu'un a t'il une idée ?
    Merci par avance de l'aide que vous pourriez m’apporter.

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bonjour,

    Dans quel contexte voulez-vous faire ça ?

  3. #3
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Dans une requete SQL en vue de faire un insert.

  4. #4
    Membre émérite Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Par défaut
    Bonjour,

    Ma solution n'est certainement pas la plus élégante mais voilà ce que je ferai :
    - une regexp pour récupérer les chiffres
    - un cast pour avoir un nombre
    - l'incrément du nombre

    Pour les expressions régulières :
    http://docs.oracle.com/cd/E11882_01/...0.htm#i1239858
    Pour le cast :
    http://docs.oracle.com/cd/E11882_01/...211.htm#i79512

    Cordialement,

    Arkhena

  5. #5
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par shaun_the_sheep Voir le message
    Dans une requete SQL en vue de faire un insert.
    Si c'est un insert unique alors la solution décrite par Arkhena est celle que je mettrais en place.

    Si c'est plusieurs insert il vaut mieux passer par une procédure stockée.

    Après niveau conception c'est moyen, le mieux serait d'avoir juste les nombres stockés en base et reconstitué la phrase lors du select.

  6. #6
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    L'idée de l’expression régulière est bonne ... mais ma chaine peut comporter deux chiffres ....

  7. #7
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Le fait qu'il y ai deux nombres de pose pas de problème quand à l'utilisation des expressions régulières.

    Je suppose que pour toi deux chiffres --> Programme 2011 diplômée 2013

    Si ce n'est pas le cas alors donne nous plus d'infos.

  8. #8
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Oui c'est bien cela .... par contre je galere pour l'expression reguliere ...

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Juste pour le plaisir
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    SELECT txt, 
    	RTRIM(CASE WHEN ch0 IS NOT NULL AND LTRIM(ch0, '0123456789') IS NULL THEN TO_CHAR(TO_NUMBER(ch0)+1) ELSE ch0 END
     	|| CASE WHEN ch1 IS NOT NULL AND LTRIM(ch1, '0123456789') IS NULL THEN ' '|| TO_CHAR(TO_NUMBER(ch1)+1) ELSE ' '|| ch1 END
     	|| CASE WHEN ch2 IS NOT NULL AND LTRIM(ch2, '0123456789') IS NULL THEN ' '|| TO_CHAR(TO_NUMBER(ch2)+1) ELSE ' '|| ch2 END
      ||CASE WHEN ch3 IS NOT NULL AND LTRIM(ch3, '0123456789') IS NULL THEN ' '|| TO_CHAR(TO_NUMBER(ch3)+1) ELSE ' '|| ch3 END
      || CASE WHEN ch4 IS NOT NULL AND LTRIM(ch4, '0123456789') IS NULL THEN ' '|| TO_CHAR(TO_NUMBER(ch4)+1) ELSE ' '|| ch4 END
      || CASE WHEN ch5 IS NOT NULL AND LTRIM(ch5, '0123456789') IS NULL THEN ' '|| TO_CHAR(TO_NUMBER(ch5)+1) ELSE ' '|| ch5 END)
      AS nouv
    FROM (
    	SELECT txt, row_number() OVER (PARTITION BY txt ORDER BY num) num,
    				lead(chaine, 0)  OVER (PARTITION BY txt ORDER BY num) ch0,
    				lead(chaine, 1)  OVER (PARTITION BY txt ORDER BY num) ch1,
    				lead(chaine, 2)  OVER (PARTITION BY txt ORDER BY num) ch2,
    				lead(chaine, 3)  OVER (PARTITION BY txt ORDER BY num) ch3,
    				lead(chaine, 4)  OVER (PARTITION BY txt ORDER BY num) ch4,
    				lead(chaine, 5)  OVER (PARTITION BY txt ORDER BY num) ch5
      FROM (
      SELECT ROWNUM num, txt,  EXTRACTVALUE(COLUMN_VALUE,'/x') AS chaine
            FROM (
    	 	SELECT 'Programme 2011 diplômée 2013' txt FROM dual
                 UNION ALL SELECT '13' txt FROM dual
                 UNION ALL SELECT 'département 13 Code postaux 13100 13001' txt FROM dual
                 ), 
              TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<list><x>'||REPLACE(txt,' ','</x><x>')||'</x></list>'),
                '/list/x')))
      ))
    WHERE num = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TXT	NOUV
    13	14
    Programme 2011 diplômée 2013	Programme 2012 diplômée 2014
    département 13 Code postaux 13100 13001	département 14 Code postaux 13101 13002
    Il y a bien sur des restrictions : un nombre doit être séparé des autres caractères par un espace, la chaine ne peut contenir &, etc..

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    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 138
    Par défaut
    Citation Envoyé par shaun_the_sheep Voir le message
    L'idée de l’expression régulière est bonne ... mais ma chaine peut comporter deux chiffres ....
    Petit point de vocabulaire

    Un chiffre, c'est un caractère compris entre 0 et 9. Il n'a pas de valeur, tout comme une lettre.

    Un nombre, c'est une chaîne composée uniquement de chiffres (au moins un), comme un mot est composé de lettres. Il représente une quantité et on peut faire des calculs avec.
    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.

  11. #11
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    merci ... j'essaie cela et désolé pour l'inversion nombre / chiffres .....

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Comment est modélisée votre table pour arriver à cette situation ?
    Comme le dit lola06, vous ne devriez pas avoir à faire ce genre d'opération sur une phrase, mais sur des éléments indépendants et proprement qualifié.

    Maintenant pour le côté technique, c'est un peu trop vague pour répondre efficacement même si McM a déjà proposé une solution assez robuste.

    Est-ce qu'il faut toujours incrémenter le masque "Programme YYYY Diplome YYYY" ou bien est-ce que cela peut varier.
    Si ça varie, un peu, beaucoup, est-ce prévisible ?

  13. #13
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    bien c'est simple. Cette table contient une notion de programme par an.
    j'ai des libelles correspondant à mes programmes et par convention on précise dans le libelle une année de rentrée et de sortie ou uniquement de promotion.

    Le libelle n'est pas toujours structuré de la même facon cela est fonction du programme.

    je cherche à dupliquer une ligne correspondant à une année pour avoir l'année suivante.

    Mon libelle n'est pas construit à partir d'élément de ma table.

    La solution transmise semble bien me convenir.

  14. #14
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Sinon avec une fonction plsql, ce sera beaucoup plus robuste.

  15. #15
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Voila, j'ai un peu galéré avec les positions.. c'est un premier jet (qui marche)
    A toi de le perfectionner.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    CREATE OR REPLACE FUNCTION F_increm_num (p_chaine IN varchar2)
    RETURN varchar2
    IS
    	v_retour varchar2(2000);
      v_len NUMBER;
      v_pos NUMBER;
      i NUMBER := 1;
    BEGIN
    	LOOP
      	-- recherche du premier chiffre
        v_pos := INSTR(p_chaine, SUBSTR(TRANSLATE(SUBSTR(p_chaine,i), '0'||TRANSLATE(SUBSTR(p_chaine,i), 'a0123456789', 'a'), '0'),1,1),i);
     
        -- Si on n'a pas trouvé, on fini la chaine
        IF NVL(v_pos,0) = 0 THEN 
        	v_retour := v_retour || SUBSTR(p_chaine, i);
    			RETURN v_retour;
        END IF;
     
      	-- On ajoute le texte jusqu'au premier chiffre
       	v_retour := v_retour || SUBSTR(p_chaine, i, v_pos -i);
    	  i :=  v_pos;	
     
        -- On récupère le chiffre
        v_len := LENGTH(SUBSTR(p_chaine, i)) - NVL(LENGTH(LTRIM(SUBSTR(p_chaine,i), '0123456789')), 0);
        v_retour := v_retour  || TO_CHAR(TO_NUMBER(SUBSTR(p_chaine, i, v_len)) +1);
     
        i := i + v_len;
     
      END LOOP;	
    	RETURN v_retour;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT txt, F_increm_num(txt)
    FROM (
    	 	SELECT 'Programme 2011 diplômée 2013a' txt FROM dual
         UNION ALL SELECT '13' txt FROM dual
         UNION ALL SELECT 'département 13 Code postaux 13100 13001' txt FROM dual
                 )
     
     
    TXT	F_INCREM_NUM(TXT)
    Programme 2011 diplômée 2013a	Programme 2012 diplômée 2014a
    13	14
    département 13 Code postaux 13100 13001	département 14 Code postaux 13101 13002

  16. #16
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Bonjour,

    Merci pour ces deux solutions ... je teste et je vous fait un retour rapide.

  17. #17
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Bonjour,

    Mille fois merci à vous McM pour cette fonction.
    Le résultat de la fonction est bien celui attendu.

    Le plus par rapport à l'autre méthode est la non restriction de caractère

  18. #18
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par shaun_the_sheep Voir le message
    Mille fois merci à vous McM pour cette fonction.
    En plus de ce remerciement textuel, je crois qu'il a bien mérité un "+1" pour s'être ainsi décarcassé.

    Car le comble, dans cette discussion, c'est que la réponse la plus récompensée est un commentaire généraliste, certes exact, mais qui ne fait pas avancer le problème.

  19. #19
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    En plus de ce remerciement textuel, je crois qu'il a bien mérité un "+1" pour s'être ainsi décarcassé.
    Excusez moi de paraître un peu ignorant mais c'est quoi ce +1 et cela sert à quoi ?

    Personnellement je vous propose de mettre à disposition ce script très bien dans la partie scripts pour qu'il puisse servir à quelqu'un d'autre .......

  20. #20
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    C'est le petit pouce vert orienté vers le haut, qui permet d'augmenter le nombre de points, et donc la réputation de fiabilité du bénéficiaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 19/09/2011, 14h57
  2. Réponses: 2
    Dernier message: 12/04/2007, 18h12
  3. Réponses: 5
    Dernier message: 02/04/2007, 15h46
  4. [Free Pascal] Suppression des espaces dans une chaîne
    Par Maxence45 dans le forum Free Pascal
    Réponses: 43
    Dernier message: 18/03/2007, 12h29
  5. [MySQL] Récupérer un nombre dans une chaîne
    Par Phenol dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2007, 22h28

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