PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Trennen einer kommagetrennten Zeichenfolge in einer PL/pgSQL-Funktion

Blue Star hat bereits erwähnt, dass es eine eingebaute Funktion gibt, um eine kommaseparierte Zeichenfolge in ein Array umzuwandeln.

Ich würde jedoch vorschlagen, zunächst keine durch Kommas getrennte Zeichenfolge zu übergeben. Wenn Sie eine variable Anzahl von IDs übergeben möchten, verwenden Sie einen variadic Parameter.

Sie müssen auch nicht zuerst ein SELECT ausführen, Sie können das System fragen, wie viele Zeilen nach der UPDATE-Anweisung aktualisiert wurden.

CREATE FUNCTION update_status(p_status text, p_id variadic integer[]) 
  RETURNS character varying
  LANGUAGE plpgsql
AS
$$
DECLARE
  v_row_count bigint DEFAULT 0;
BEGIN
  UPDATE test
  SET status     = p_status,
      updated_by = 'admin'
  WHERE user_id = any (p_id);
    
  get diagnostics v_row_count = row_count;
  if v_row_count = 0 then 
    return 'User not found';
  end if;
  
  return concat(v_row_count, ' users updated');
END
$$;

Sie können es wie folgt verwenden:

select update_status('active', 1);
select update_status('active', 5, 8, 42);

Wenn Sie dies aus irgendeinem Grund als einzelnes Argument übergeben "müssen", verwenden Sie stattdessen ein echtes Array:

CREATE FUNCTION update_status(p_status text, p_id integer[]) 

Dann übergeben Sie es so:

select update_status('active', array[5,8,42]);

oder

select update_status('active', '{5,8,42}');