PostgreSQL 将每个项目添加到列表 - 数据库函数

PostgreSQL add each item to list - DB functions

我想创建一个接受数字列表和 return 数字列表的数据库函数。对于传递给函数的列表中的每个项目,它应该检查一些条件并将其添加到响应列表中。但是,我不认为我尝试这样做的方式真的是正确的。我尝试写的基本上是这里的一些伪代码。

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
returns integer[]
AS 
$BODY$
   DECLARE return_list integer[];

   FOREACH field IN ARRAY numbers LOOP
      CASE
         WHEN field = 3 THEN -- add 43 (this was a random thought, but I am basically trying to map a few of the numbers to different values)
      END
   END LOOP;

RETURN QUERY SELECT * FROM return_list;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

您需要将其放入 IF 语句中。要 append 数组的值,请使用 ||

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
returns integer[]
AS 
$BODY$
DECLARE 
  return_list integer[] := integer[];
BEGIN
  FOREACH field IN ARRAY numbers LOOP
    if field = 3 then 
      return_list := return_list || 43;
    elsif field = 15 then 
      return_list := return_list || 42;
    else
      return_list := return_list || field;
    end if;
  END LOOP;
  return return_list; --<< no SELECT required, just return the variable
END;  
$BODY$
LANGUAGE plpgsql --<< you need PL/pgSQL, not SQL for the above
STABLE;

这也可以使用 SQL 而不是 PL/pgSQL 来完成,后者通常更有效:

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
  returns integer[]
AS 
$BODY$
  select array_agg(field order by idx)
  from (
    select case 
              when field = 3 then 43
              when field = 15 then 42
              else field
           end as field,
           idx
    from unnest(numbers) with ordinality as t(field, idx)
  ) x;
$BODY$
LANGUAGE sql 
STABLE;