53 votes

Comment appliquer une fonction à chaque élément d'une colonne de tableau dans Postgres ?

Une requête Pg renvoie un tableau. Je voudrais récupérer cela avec chaque élément formaté à 3 décimales. Comment appliquer une fonction à chaque élément d'un tableau ? Quelque chose comme ce qui suit (faux, évidemment) --

 SELECT Round(ARRAY[1.53224,0.23411234], 2);
{1.532, 0.234}

Je suppose que je cherche quelque chose comme la fonction map Perl.

115voto

Joey Adams Points 13049

Tout d'abord, transformez le tableau en un ensemble en utilisant unnest :

 > SELECT n FROM unnest(ARRAY[1.53224,0.23411234]) AS n;
     n      
------------
    1.53224
 0.23411234
(2 rows)

Ensuite, appliquez une expression à la colonne :

 > SELECT ROUND(n, 2) FROM unnest(ARRAY[1.53224,0.23411234]) AS n;
 round 
-------
  1.53
  0.23
(2 rows)

Enfin, utilisez array_agg pour reconvertir l'ensemble en tableau :

 > SELECT array_agg(ROUND(n, 2)) FROM unnest(ARRAY[1.53224,0.23411234]) AS n;
  array_agg  
-------------
 {1.53,0.23}
(1 row)

33voto

Pavel Stehule Points 8337
postgres=# select array(select round(unnest(array[1.2,2.4,3,4])));
   array   
-----------
{1,2,3,4}
(1 row)

14voto

mask8 Points 2114

Vous devrez peut-être créer une fonction stockée. Voici celui qui fait ce dont vous avez besoin :

 CREATE OR REPLACE FUNCTION array_round(float[], int)
RETURNS float[]
AS
$$
DECLARE
   arrFloats ALIAS FOR $1;
   roundParam ALIAS FOR $2;
   retVal float[];
BEGIN
   FOR I IN array_lower(arrFloats, 1)..array_upper(arrFloats, 1) LOOP
    retVal[I] := round(CAST(arrFloats[I] as numeric), roundParam);
   END LOOP;
RETURN retVal;
END;
$$
LANGUAGE plpgsql 
   STABLE 
RETURNS NULL ON NULL INPUT;

Ensuite, appelez quelque chose comme ceci :

 # SELECT array_round(ARRAY[1.53224,0.23411234], 2);
 array_round 
-------------
 {1.53,0.23}
(1 row)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X