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

Informix Discussion :

déconcaténation dans un SELECT


Sujet :

Informix

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut déconcaténation dans un SELECT
    Bonjour à tous,

    J'utilise Informix 11.10.
    Je souhaite remplir une table cible à l'aide des données (transformées) d'une table source.

    Voici le problème que je rencontre :
    Dans une table source, une colonne PRENOMS est composée de trois prénoms séparés par une ' (apostrophe). Dans la table cible, je souhaite insérer un prénom par colonne.

    Exemple de données :
    Dans la table source, on a :

    PRENOMS
    michel'romain'thibaut

    Dans la table cible, je souhaiterais avoir :

    PRENOM1
    michel

    PRENOM2
    romain

    PRENOM3
    thibaut

    La solution doit être quelque chose dans ce genre, avec la position de l'apostrophe dans les crochets :

    INSERT INTO table_cible:personne (PRENOM1, PRENOM2, PRENOM3)
    SELECT PRENOMS[,], PRENOMS[,], PRENOMS[,]
    FROM table_source:personne


    Le tout est de savoir comment récupérer la position des apostrophes.

    Auriez-vous une idée ?

    Merci d'avance.

    Romain.

  2. #2
    Invité
    Invité(e)
    Par défaut Passage par "vi"
    Bonjour,

    Je verrais bien quelque chose comme ça :

    1. faire un unload :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UNLOAD TO prenoms.out
    SELECT personne.id_personne,
           personne.prenoms;
    2. Sous "vi", remplacer les apostrophes par des pipes

    3. Adapter puis exécuter le sql ci-dessous :

    - création d'une table temporaire
    - suppression du contenu de la table temporaire
    - importation du fichier prenoms.out
    - actualisation de la table "personne"

    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
    SELECT UNIQUE personne.id_personne id_personne,
                  personne.prenoms     prenom_1,
                  personne.prenoms     prenom_2,
                  personne.prenoms     prenom_3
    INTO TEMP tmp;
     
    DELETE FROM  tmp
    WHERE        tmp.id_personne IS NOT NULL;
     
    LOAD FROM prenoms.out INSERT INTO tmp;
     
    CREATE UNIQUE CLUSTER INDEX tmp_id_personne ON tmp (id_personne);
     
    UPDATE personne
    SET   (personne.prenom_1,
           personne.prenom_2,
           personne.prenom_3) = ((SELECT tmp.prenom_1,
                                         tmp.prenom_2,
                                         tmp.prenom_3
                                  FROM   tmp
                                  WHERE  tmp.id_personne = personne.id_personne));

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut SPL
    Merci pour ta réponse mais :

    1. je suis sous Windows
    2. je dois à présent utiliser une procédure stockée

    Voici ce que j'ai commencé à faire :

    Je passe en paramètre la chaîne complète de type michel'romain'thibaut, le delimiter ' et quel prénom je dois retourner (le premier, deuxième ou troisième).
    Je parcours la chaîne jusqu'à ce que je trouve le delimiter ', puis je stocke les prénoms séparément et je retourne le bon prénom en fin de procédure.

    J'obtiens des erreurs de syntaxe, sans détails malheureusement et je n'arrive pas à débugger...

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    CREATE PROCEDURE parse_del (str CHAR(80), del CHAR(1), nb CHAR(1))
    RETURNING VARCHAR(33);
     
    DEFINE delim CHAR(1);
    DEFINE dpick CHAR(1);
    DEFINE ilen smallint;
    DEFINE idex smallint;
    DEFINE cnter smallint;
    DEFINE ret1 VARCHAR(33);
    DEFINE ret2 VARCHAR(33);
    DEFINE ret3 VARCHAR(33);
     
    --SET debug file TO "C:\trace.data";
     
    LET delim = del;
    LET ilen = length(str);
    LET nb_temp = nb - 1;
     
    CREATE TEMP TABLE b (
       newstr CHAR(80)
       ) with no log;
    INSERT INTO b VALUES (str);
     
    --trace on;
     
    LET cnter = 1;
    FOR idex = 1 TO ilen
      SELECT substr(newstr,idex,1) INTO dpick FROM b;
      IF dpick = delim THEN
         LET nb_temp = nb_temp + 1;
         SELECT substr(newstr,cnter,(idex-cnter)) INTO ret || nb_temp FROM b;
         LET cnter = idex + 1;
      END IF;
    END FOR;
     
    --trace off;
     
    DROP table b;
    RETURN ret || nb;
    END PROCEDURE;

  4. #4
    Invité
    Invité(e)
    Par défaut Informix sous Windows ?
    Bonjour,

    J'ai passé la date de péremption. C'est trop compliqué pour moi...

    Par contre, cela m'intéresse de savoir si vraiment tu utilises Informix sous Windows. Ca existe ?

    En tout cas, je vois qu'il est possible de créer une table temporaire sans passer par un select. Je ne suis pas sûr que je pouvais le faire avec ma vieille version d'Informix. Il était temps que je prenne ma retraite !...

    En tentant de comprendre ton script, je m'étonne que "nb" soit en "char(1)", ce ne serait pas du smallint ? Et nb_temp, il apparait comme ça ?...
    Dernière modification par Invité ; 26/02/2008 à 08h43.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Solution : routine récupérant la position du délimiteur !
    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
    32
    CREATE FUNCTION parse_delimiter (str VARCHAR(50), del CHAR(1), nb_del SMALLINT)
    RETURNING SMALLINT;
     
    {cette fonction retourne la postion d un caractère spécifique dans une chaîne de caractères
    elle attend en paramètre une chaîne de caractère, un délimiteur et nb_del correspond au nième délimiteur recherché}
     
    DEFINE dpick CHAR(1); --les caractères parcourues dans la chaîne de caractères seront stockés tour à tour dans dpick
    DEFINE ilen SMALLINT; --longueur de la chaîne de caractères passée en paramètre
    DEFINE idex SMALLINT; --index incrémenté par la suite dans une boucle pour parcourir la chaîne de caractères
    DEFINE nb_temp SMALLINT; --tempo qui permet de vérifier si le caractère recherché est le bon
    DEFINE position SMALLINT; --variable retournée qui correspond à la position du caractère recherché
     
    LET ilen = length(str); --longueur de la chaîne de carcatères passée en paramètre
    LET nb_temp = 0;
     
    FOR idex = 1 TO ilen --on parcourt la chaîne de caractères
      LET dpick = substr(str,idex,1); --chaque caractère parcouru est stocké dans dpick
      IF dpick = del THEN --si le caractère parcouru est celui recherché
        LET nb_temp = nb_temp + 1;
     
        IF nb_temp = nb_del THEN --on vérifie s il s agit bien du nième caractère recherché
          LET position = idex; --on sauvegarde la position du caractère
          EXIT FOR;
        END IF;
     
      END IF;
     
    END FOR;
     
    RETURN position; --on retourne la position du caractère recherché
     
    END FUNCTION;

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

Discussions similaires

  1. formater un champ date dans un select
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/04/2006, 16h44
  2. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  3. Joindre une valeur arbitraire dans un SELECT
    Par Tuxxy dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/01/2004, 17h04
  4. Réponses: 3
    Dernier message: 23/09/2003, 09h12
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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