sql >> Databasteknik >  >> RDS >> PostgreSQL

Använd `trim()` och `regexp_replace()` på textarray

Din kod ändrar aldrig multiplevalues array. Det ändrar bara varje element och kastar sedan bort det nya värdet.

Du behöver en variabel där du kan aggregera dina resultat till:

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;

Men detta kan göras lite enklare med en unnest och array_agg och en vanlig SQL-funktion (snarare än PL/pgSQL)

Du måste först avnesta arrayen, trimma värdena och aggregatet som tillbaka till en array.

Jag är inte säker på att jag förstår vad du försöker göra, men detta kommer att trimma alla värden i arrayen och returnera ett nytt:

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;


  1. Databaser:Göra en logg över åtgärder, hur hanterar man olika referenser?

  2. PostgreSQL-motsvarighet till Oracles PERCENTILE_CONT-funktion

  3. Hur stänger man datakällans anslutning ordentligt?

  4. Hur rensar jag SqlDependency från SQL Server-minnet?