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

Requêtes PostgreSQL Discussion :

Passer une colonne de type tableau en ligne


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau Candidat au Club
    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
    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
    Rédacteur/Modérateur

    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
    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
    Rédacteur/Modérateur

    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
    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
    Rédacteur/Modérateur

    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

###raw>template_hook.ano_emploi###