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

Posted

技术标签:

【中文标题】PostgreSQL 将每个项目添加到列表中 - 数据库函数【英文标题】:PostgreSQL add each item to list - DB functions 【发布时间】:2020-08-04 08:22:57 【问题描述】:

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

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;

【问题讨论】:

【参考方案1】:

您需要将其放入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;

【讨论】:

以上是关于PostgreSQL 将每个项目添加到列表中 - 数据库函数的主要内容,如果未能解决你的问题,请参考以下文章

将多个项目添加到列表视图,每个项目从按钮单击的另一个意图接收

在 postgresql 中将模式添加到路径

将项目从对话框添加到 ListView

如何从列表视图按钮单击将多个数据添加到数组列表?

如何将项目添加到列表框?

如何将新项目附加到 PostgreSQL 中的数组类型列中