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

Anvend `trim()` og `regexp_replace()` på tekstarray

Din kode ændrer aldrig multiplevalues array. Det ændrer bare hvert element og kaster derefter den nye værdi væk.

Du skal bruge en variabel, hvor du kan samle dine resultater til:

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 dette kan gøres lidt enklere ved at bruge en unnest og array_agg og en almindelig SQL-funktion (i stedet for PL/pgSQL)

Du skal først fjerne arrayet, trimme værdierne og aggregatet, der er tilbage i et array.

Jeg er ikke sikker på, jeg forstår, hvad du prøver at gøre, men dette vil trimme alle værdier inde i arrayet og returnere en ny:

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. psql.exe - adgangskodegodkendelse mislykkedes i Windows

  2. MySQL overordnede børn et valg af forespørgsel

  3. PostgreSQL-serveren ville ikke lukke ned på Lion (Mac OS 10.7)

  4. Hurtig måde at generere sammenkædede strenge i Oracle