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

Langage SQL Discussion :

Décoder un varchar sur plusieurs lignes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Décoder un varchar sur plusieurs lignes
    Bonjour,

    J'aimerais savoir s'il était possible de transformer en colonnes toutes les combinaisons possibles d'un varchar pour un ensemble de 2 caractères.

    Il ne s'agit pas forcément d'un problème propre à PostgreSQL, c'est seulement le SGBD que j'utilise.

    Ex :

    J'ai une table A qui ne contient qu'une colonne et plusieurs lignes :

    Ligne 1 : 'ABCD'
    Ligne 2 : 'ABXY'

    Je souhaiterais avoir en sortie de ma requête :

    Ligne 1 : 'AB'
    Ligne 2 : 'BC'
    Ligne 3 : 'CD'
    Ligne 4 : 'BX'
    Ligne 5 : 'XY'

    L'un d'entre vous a-t-il une idée ?

    Merci pour votre aide.

    Cordialement,

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    EDIT : Je vois pas comment faire en SQL désolé..
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    En SQL pur c'est un peu plus compliqué qu'en PL/pgSQL, mais ça reste faisable en utilisant par exemple la récursivité :
    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 table matable (id_ligne serial, valeur varchar(30));
     
    insert into matable (valeur) values ('ABCD'), ('ABXY');
     
    with RECURSIVE cter_matable (id_ligne, valeur, extract, pos) as
    (
    select id_ligne
         , valeur
         , substring(valeur, 1, 2)
         , cast(1 as int)
      from matable
     union all
    select id_ligne
         , valeur
         , substring(valeur, pos + 1, 2)
         , pos + 1
      from cter_matable
     where length(substring(valeur, pos + 1, 2)) = 2
    )
      select extract
        from cter_matable
    group by extract
    order by min(id_ligne), min(pos);
     
    EXTRACT
    -------
    AB
    BC
    CD
    BX
    XY

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez aussi vous appuyer sur une table de nombres éventuellement existante (avec postgre, vous pouvez utiliser generate_series) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT SUBSTRING(LaColonne, n, 2)
    FROM LaTable
    INNER JOIN generate_series(1,(SELECT MAX(LENGTH(LaColonne)) FROM LaTable)) AS Nombre(n)
    	ON n < LENGTH(LaColonne)

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ah oui tient, c'est plus simple !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup à vous deux, j'étais parti sur une fonction avec loop .... Pas très joli mais aboutissant au même résultat ^^

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

Discussions similaires

  1. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 14h47
  2. Response.Write sur plusieurs lignes
    Par simoryl dans le forum ASP
    Réponses: 2
    Dernier message: 31/08/2004, 22h49
  3. Réponses: 2
    Dernier message: 10/05/2004, 07h55
  4. TDBGrid - Un enregistrement sur plusieurs lignes
    Par BRODU dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2004, 07h53
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45

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