PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wenden Sie `trim()` und `regexp_replace()` auf das Textarray an

Ihr Code ändert niemals die multiplevalues Reihe. Es ändert nur jedes Element und wirft dann diesen neuen Wert weg.

Sie benötigen eine Variable, in der Sie Ihre Ergebnisse aggregieren können:

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;

Dies kann jedoch etwas einfacher mit einem Unnest und array_agg und einer einfachen SQL-Funktion (statt PL/pgSQL) durchgeführt werden

Sie müssen zuerst das Array entschachteln, die Werte zuschneiden und diese wieder in ein Array aggregieren.

Ich bin mir nicht sicher, ob ich verstehe, was Sie versuchen, aber dies wird alle Werte innerhalb des Arrays kürzen und einen neuen zurückgeben:

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;