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 将每个项目添加到列表中 - 数据库函数的主要内容,如果未能解决你的问题,请参考以下文章