PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Applica `trim()` e `regexp_replace()` sull'array di testo

Il tuo codice non cambia mai i multiplevalues Vettore. Cambia semplicemente ogni elemento, quindi butta via quel nuovo valore.

Hai bisogno di una variabile in cui aggregare i tuoi risultati in:

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;

Ma questo può essere fatto in modo un po' più semplice usando unnest e array_agg e una semplice funzione SQL (piuttosto che PL/pgSQL)

Devi prima annullare l'annidamento dell'array, tagliare i valori e aggregarli nuovamente in un array.

Non sono sicuro di aver capito cosa stai cercando di fare, ma questo taglierà tutti i valori all'interno dell'array e ne restituirà uno nuovo:

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;