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

Opdeling af kommasepareret streng i PL/pgSQL-funktion

Blue Star har allerede nævnt, at der er en indbygget funktion til at konvertere en kommasepareret streng til en matrix.

Men jeg vil foreslå, at du ikke sender en kommasepareret streng til at begynde med. Hvis du vil videregive et variabelt antal ID'er, brug en variadic parameter.

Du behøver heller ikke først at køre en SELECT, du kan spørge systemet, hvor mange rækker der blev opdateret efter UPDATE-sætningen.

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
$$;

Du kan bruge det sådan her:

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

Hvis du af en eller anden grund "skal" sende dette som et enkelt argument, skal du bruge et rigtigt array i stedet:

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

Så send det sådan her:

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

eller

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


  1. mysql-forespørgsel med lignende %..% i where-klausulen, der returnerer forskellige resultater

  2. Tilføjelse (skub) og fjernelse fra et JSON-array i PostgreSQL 9.5+

  3. 2 måder at sammenkæde en streng og et tal i Oracle

  4. Opdater rækker i én tabel med data fra en anden tabel baseret på, at én kolonne i hver er ens