PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Aplique `trim()` e `regexp_replace()` na matriz de texto


Seu código nunca altera os multiplevalues variedade. Ele apenas altera cada elemento e, em seguida, joga esse novo valor fora.

Você precisa de uma variável na qual possa agregar seus resultados em:
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;

Mas isso pode ser feito um pouco mais simples usando unnest e array_agg e uma função SQL simples (em vez de PL/pgSQL)

Você precisa primeiro desaninhar a matriz, cortar os valores e agregá-los de volta em uma matriz.

Não tenho certeza se entendi o que você está tentando fazer, mas isso cortará todos os valores dentro da matriz e retornará um novo:
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;