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

Discussion :

Passer une colonne de type tableau en ligne


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    novembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : novembre 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Passer une colonne de type tableau en ligne
    Bonjour,
    Je bloque sur une requête SQL.
    J'ai une table contenant une colonne de type text[] et je voudrais avoir en resultat autant d eligne que d'élément dans mon array.
    Exemple, passer de:
    'Toto',{'A','B','C'}
    'Tata',{'A',D'}

    en
    'Toto,'A'
    'Toto,'B'
    'Toto,'C'
    'Tata,'A'
    'Tata,'D'

    Merci de votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Responsable SIG
    Inscrit en
    février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable SIG
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : février 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je rencontre la même problématique, et je n'ai pas d'idée concernant la méthode. Quelqu'un pourrait-il fournir une aide svp ?

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 807
    Points : 23 039
    Points
    23 039
    Par défaut
    Bonjour,

    C'est la fonction UNNEST() qui va vous permettre de faire ce que vous demandez.
    En reprenant l'exemple du premier post, en supposant que la table s'appelle test, la première colonne col1 et la colonne contenant le tableau col2, voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT col1, UNNEST(col2)
    FROM test;
    Mais bon, stocker de l'information sous forme de tableau dans une colonne, c'est une belle erreur de modélisation et une entorse à la première forme normale... On comprend vite les problèmes que ça pose, dès qu'on veut requêter, n'est-ce pas ? . On est obligé de bidouiller...

    Voilà pourquoi on normalise un modèle de données...

    @+
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable SIG
    Inscrit en
    février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable SIG
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : février 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je vous remercie pour l'information. Pour ma part, ce n'est pas exactement un "vrai" tableau. Les données sont stockées dans une colonne de type text et proviennent d'une requête qui doit utiliser la fonction array_agg. De fait, la fonction unnest ne se lance pas. Donc si vous avez une idée pour faire une sorte de déconcaténation, je suis preneur.

    Je récupère des données d'un prestataire qui utilise une géométrie de type ponctuel alors que l'objet devrait être de type surfacique. Si l'objet avait été surfacique, j'aurais pu faire une requête par un ST_INTERSECTS mais là, ce sont les attributs stockés dans une colonne de type text qui doivent me servir à faire une jointure attributaire pour pouvoir récupérer la donnée liée à la géométrie.

    J'espère avoir été clair dans mes explications et vous remercie pour l'aide apportée.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 807
    Points : 23 039
    Points
    23 039
    Par défaut
    OK, ce n'est pas tout-à-fait le même problème que le premier post, alors...

    Si j'ai bien compris, vous avez plutôt une table de cette forme :
    col1 | col2
    ----------
    Toto | A,B,C
    Tata | A,D
    Et vous voulez obtenir quelque chose comme ça
    col1 | col2
    ----------
    Toto | A
    Toto | B
    Toto | C
    Tata | A
    Tata | D
    Du coup, une des solutions, c'est de transformer le contenu de col2 en tableau avec la fonction STRING_TO_ARRAY(), puis de passer par UNNEST() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT col1, UNNEST(STRING_TO_ARRAY(col2, ',')) 
    FROM test;
    Si ça n'est pas ça, pouvez-vous donner un exemple de vos données ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable SIG
    Inscrit en
    février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable SIG
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : février 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Ma table est formée comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1 | col2
    ----------
    Toto | {"A","B","C"}
    Tata | {"A"}
    C'est ce qui me fait dire que ça provient d'un array_agg.
    Avec la requête que vous proposez, je me retrouve avec des choses comme àa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    col1 | col2
    ----------
    Toto | {"A"
    Toto | "B"
    Toto | "C"}
    Tata | {"A"}
    Je pense pouvoir me débrouiller pour faire le nettoyage et enlever les caractères dont je n'ai pas besoin.
    Je vous remercie vivement pour votre aide.

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 807
    Points : 23 039
    Points
    23 039
    Par défaut
    OK.

    Donc, c'est encore plus simple, il vous suffit de caster votre deuxième colonne en tableau de texte dans la requête, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT col1, UNNEST((col2)::TEXT[])
    FROM test;
    @+
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/04/2014, 03h48
  2. Réponses: 1
    Dernier message: 11/10/2013, 13h56
  3. Réponses: 5
    Dernier message: 15/01/2008, 17h23
  4. Réponses: 5
    Dernier message: 19/04/2005, 09h46
  5. requete vers une colonne de type datetime
    Par Zorgz dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2003, 12h37

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