sql >> Databáze >  >> RDS >> PostgreSQL

Použijte `trim()` a `regexp_replace()` na textové pole

Váš kód nikdy nemění multiplevalues pole. Prostě změní každý prvek a pak tuto novou hodnotu zahodí.

Potřebujete proměnnou, kde můžete agregovat své výsledky do:

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;

Ale to lze udělat trochu jednodušeji pomocí unnest a array_agg a obyčejné funkce SQL (spíše než PL/pgSQL)

Nejprve musíte zrušit vnoření pole, oříznout hodnoty a agregovat zpět do pole.

Nejsem si jistý, jestli rozumím tomu, co se snažíte udělat, ale tím se oříznou všechny hodnoty v poli a vrátí se nová:

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. Jak získám asynchronní / událostmi řízenou podporu LISTEN/NOTIFY v Javě pomocí databáze Postgres?

  2. Jak mohu bezpečně předat sekvenci primárních klíčů v Django?

  3. Automatické odstranění data/času záznamu MSSQL

  4. Jak provést vyhledávání LIKE se zašifrovanými daty?