How to apply a function to each element of an array column in Postgres?
First, turn the array into a set using unnest:
> SELECT n FROM unnest(ARRAY[1.53224,0.23411234]) AS n; n ------------ 1.53224 0.23411234(2 rows)
Then, apply an expression to the column:
> SELECT ROUND(n, 2) FROM unnest(ARRAY[1.53224,0.23411234]) AS n; round ------- 1.53 0.23(2 rows)
Finally, use array_agg to turn the set back into an array:
> SELECT array_agg(ROUND(n, 2)) FROM unnest(ARRAY[1.53224,0.23411234]) AS n; array_agg ------------- {1.53,0.23}(1 row)
postgres=# select array(select round(unnest(array[1.2,2.4,3,4]))); array -----------{1,2,3,4}(1 row)
You may need to create a stored function. Here is the one that does what you need:
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;
Then call something like this:
# SELECT array_round(ARRAY[1.53224,0.23411234], 2); array_round ------------- {1.53,0.23}(1 row)