PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Appliquer `trim()` et `regexp_replace()` sur le tableau de texte

Votre code ne change jamais les multiplevalues déployer. Il change simplement chaque élément, puis jette cette nouvelle valeur.

Vous avez besoin d'une variable dans laquelle vous pouvez agréger vos résultats :

CREATE OR REPLACE FUNCTION manipulate_array(multiplevalues text[])
RETURNS text[] AS 
$BODY$
  DECLARE 
    singlevalue text;
    l_result text[] := '{}'::text[]; -- initialize with an empty array
  BEGIN
    FOREACH singlevalue IN ARRAY multiplevalues LOOP
        SELECT trim(regexp_replace(singlevalue, '\s+', ' ', 'g')) INTO singlevalue;
        l_result := l_result || singlevalue; -- append to the result
    END LOOP;

    RETURN l_result; -- return the new array, not the old one
  END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Mais cela peut être fait un peu plus simplement en utilisant un unnest et un array_agg et une fonction SQL simple (plutôt que PL/pgSQL)

Vous devez d'abord désimbriquer le tableau, découper les valeurs et l'agrégat qui les ramène dans un tableau.

Je ne suis pas sûr de comprendre ce que vous essayez de faire, mais cela supprimera toutes les valeurs à l'intérieur du tableau et en renverra une nouvelle :

create function trim_all(p_values text[])
  returns text[]
as
$$
  select array_agg(trim(regexp_replace(t.v, '\s+', ' ', 'g')) order by t.nr)
    from unnest(p_values) with ordinality as t(v, nr);
$$
language sql;