PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 25/07/2013 14:01:29

thierrythie
Membre

ligne vers un tableau

bonjour a tous,
j'ai besoin de convertir des lignes dans un champs en tableau,
je crois 'est pas assez claire mais je vais illustrer avec un exemple.
Si j'ai  le nom d'une colonne TEST:
TEST
----
1
6
4
9

est ce que c'est possible de faire select  Array(TEST)  from ..........  par exemple pour avoir (1,6,4,9).
merci de votre aide

Hors ligne

#2 25/07/2013 14:21:12

rjuju
Administrateur

Re : ligne vers un tableau

Bonjour,


vous pouvez utiliser l'aggrégat «array_agg(champ)».

Hors ligne

#3 25/07/2013 14:25:24

Bidou
Membre

Re : ligne vers un tableau

Bonjour,

Je pense que ce que vous cherchez est la fonction array_ag().


Par exemple si vous avez déclaré une variable a_ text[]


SELECT INTO a_ array_agg(TEST) FROM myTable;

EDIT : Oups trop lent

Dernière modification par Bidou (25/07/2013 14:26:08)

Hors ligne

#4 25/07/2013 17:08:15

thierrythie
Membre

Re : ligne vers un tableau

salut
C'est exactement la fonction que je cherche.
merci beaucoup.

Hors ligne

#5 25/07/2013 17:25:17

thierrythie
Membre

Re : ligne vers un tableau

et pour le parcours,
par exemple si j'ai un tableau "myTab",
Est ce que je peux faire :
FOR  inombre in  myTab
LOOP
ou autres,
parce que ca genère toujours des erreurs,
merci

Hors ligne

#6 25/07/2013 17:35:29

Bidou
Membre

Re : ligne vers un tableau

Si vous utilisez une version de PostgreSQL supérieur à 9.1 vous pouvez faire :


FOREACH a_row IN ARRAY a_
LOOP

END LOOP;

Dernière modification par Bidou (25/07/2013 17:48:25)

Hors ligne

#7 25/07/2013 17:40:45

thierrythie
Membre

Re : ligne vers un tableau

donc ton tableau s'appelle a_ ???

Hors ligne

#8 25/07/2013 17:42:13

thierrythie
Membre

Re : ligne vers un tableau

mon postgres c'est 9.1.1 et n'accepte pas le foreach

Hors ligne

#9 25/07/2013 17:47:44

Bidou
Membre

Re : ligne vers un tableau

PostgreSQL vous indique quoi comme erreur?
Sinon :
FOR a_row IN SELECT unnest(a_) LOOP
 
END LOOP;

Avec a_ pour mon tableau oui.

Dernière modification par Bidou (25/07/2013 17:48:06)

Hors ligne

#10 25/07/2013 17:50:49

thierrythie
Membre

Re : ligne vers un tableau

C'est OK merci beaucoup

Hors ligne

#11 29/07/2013 10:39:53

thierrythie
Membre

Re : ligne vers un tableau

salut l'ami,
comment faire pour insérer une valeur dans un tableau de string.
par exemple si j'ai un boucle a j’insère la valeur dans un tableau selon ma condition dans la boucle
merci

Hors ligne

#12 29/07/2013 11:11:54

Bidou
Membre

Re : ligne vers un tableau

Bonjour,

Je vous conseille de lire la documentation des ARRAYs PostgreSQL : http://www.postgresql.org/docs/9.1/static/arrays.html
On y trouve notamment les fonction array_prepend(elem, array) et array_append(array, elem).

Hors ligne

#13 29/07/2013 11:34:02

thierrythie
Membre

Re : ligne vers un tableau

CREATE OR REPLACE FUNCTION get_avg( mylist character varying[])
  RETURNS character varying AS
$BODY$declare
   
   
    tmplist        character varying[];
    inombre     character varying(128);
    tmp        character varying(128) = '';
    tmp2        character varying(128) = '';
    content_col    character varying(128);

begin

    for  inombre  in  select unnest(mylist)
    loop
        content_col =inombre;
        if substring(content_col, length(content_col), 1) = '+' then
            tmp = replace(content_col, '+', '');
            array_append(tmplist,tmp);
        else
           
        end if;
    end loop;
   


end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION get_min( character varying [])
  OWNER TO postgres;

et les message d'erreur est

ERREUR:  erreur de syntaxe sur ou près de « array_append »
LINE 23:    array_append(tmplist,tmp);
            ^

********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « array_append »
État SQL :42601
Caractère : 526

Hors ligne

#14 29/07/2013 11:42:54

Bidou
Membre

Re : ligne vers un tableau

Essayez avec ça :


tmplist := array_append(tmplist,tmp);

Dernière modification par Bidou (29/07/2013 11:43:48)

Hors ligne

#15 29/07/2013 11:47:50

thierrythie
Membre

Re : ligne vers un tableau

C'est OK merci , et est 'il possible d'utiliser la fonction min ou max ou avg sur ma liste  dans un tableau

Hors ligne

#16 29/07/2013 11:55:48

Bidou
Membre

Re : ligne vers un tableau

De la même façon que pour la boucle sur l'ARRAY :

SELECT MAX(val) FROM UNNEST(tmplist) val;

Hors ligne

#17 29/07/2013 12:17:14

thierrythie
Membre

Re : ligne vers un tableau

est ce que ca ressemble a ca par exemple:

CREATE OR REPLACE FUNCTION get_avg( mylist character varying[])
  RETURNS character varying AS
$BODY$declare
   
    inombre     character varying(128);

begin

    for  inombre  in  select unnest(mylist)
    loop
        SELECT MAX(inombre) FROM UNNEST(tmplist) val;   
    end loop;

   
return val;


end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION get_avg( character varying [])
  OWNER TO postgres;

-----------------------------------------------------------
-------------------------------------------------------------

ou
-------------------------------
---------------------------

CREATE OR REPLACE FUNCTION get_avg( mylist character varying[])
  RETURNS character varying AS
$BODY$declare
   
    inombre     character varying(128);
    ex         character varying = '';

begin

        ex = SELECT MAX(val) FROM UNNEST(mylist) val;   

return ex;


end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION get_avg( character varying [])
  OWNER TO postgres;

--select get_avg('{1.5,1.9,34,0.3}')


j'ai un peu du mal sur l'utilisation syntaxique, je debute sur Postgres
l'erreur est:
ERREUR:  la requête n'a pas de destination pour les données résultantes
HINT:  Si vous voulez annuler les résultats d'un SELECT, utilisez PERFORM à la place.
CONTEXT:  fonction PL/pgsql get_avg(character varying[]), ligne 26 à instruction SQL

********** Erreur **********

ERREUR: la requête n'a pas de destination pour les données résultantes
État SQL :42601
Astuce : Si vous voulez annuler les résultats d'un SELECT, utilisez PERFORM à la place.

Hors ligne

#18 29/07/2013 13:22:26

thierrythie
Membre

Re : ligne vers un tableau

j'ai un ptit erreur sur le copy coller mais l'idee c'est ca

Hors ligne

#19 29/07/2013 14:03:51

thierrythie
Membre

Re : ligne vers un tableau

ok j'ai resolu le problème, j'ai obtenu le min et le max
il me reste la moyenne car ma liste est en character varying et donne un erreur.
je cherche encore la solution

Hors ligne

#20 29/07/2013 14:11:25

thierrythie
Membre

Re : ligne vers un tableau

Ok C'est resolu la moyenne,
Merci beaucoup

Hors ligne

#21 29/07/2013 14:13:09

Bidou
Membre

Re : ligne vers un tableau

Pour assigner le résultat de votre requête dans votre variable il faut faire

SELECT MAX(val) INTO ex FROM UNNEST(mylist) val;

Hors ligne

#22 30/07/2013 08:42:53

thierrythie
Membre

Re : ligne vers un tableau

ok merci, C'est ok

Hors ligne

Pied de page des forums