gpt4 book ai didi

arrays - 合并和返回数组

转载 作者:行者123 更新时间:2023-11-29 13:11:14 25 4
gpt4 key购买 nike

我有两个函数,

CREATE OR REPLACE FUNCTION function_a(input varchar)
RETURNS setof integer AS $$
BEGIN
RETURN QUERY
SELECT somecolumn FROM some_things WHERE a_column = input;
END;
$$ LANGUAGE PLpgSQL;


CREATE OR REPLACE FUNCTION function_b(inputs varchar[])
RETURNS setof integer AS $$
DECLARE
input varchar;
result integer[];
BEGIN
FOREACH input IN ARRAY inputs LOOP
result := result || ARRAY[function_a(input)];
END LOOP;
END;
$$ LANGUAGE PLpgSQL;

我正在运行它,

 SELECT function_b(ARRAY['a', 'b']);

错误,

ERROR:  query "SELECT result || ARRAY[function_a(input)]" returned more than one row
CONTEXT: PL/pgSQL function function_b(character varying[]) line 7 at assignment

我只想在数组上运行一个函数。我一直使用像 Ruby 这样的脚本语言来做这种事情,而不是使用 SQL,但我正在尝试学习 SQL,因为它在数据库控制台本身上获得结果的速度要快得多。我希望它不是那么令人沮丧。

最佳答案

首先,在SQL中我们主要是写查询。您可以使用一个简单的查询来执行相同的操作:

select somecolumn 
from some_things
where a_column = any(array['a', 'b']);

如果你需要一个函数,它可能是一个 SQL 函数:

create or replace function sql_function(inputs text[])
returns setof integer language sql as $$
select somecolumn
from some_things
where a_column = any(inputs);
$$;

SQL 函数比 plpgsql 函数更简单,通常也更快。

回到您的function_b() - the array constructor应该是这样的:

ARRAY(SELECT function_a(input))

另请注意,该函数不返回任何内容。因为您将结果聚合在一个数组中,所以您应该取消嵌套它以返回行:

CREATE OR REPLACE FUNCTION function_b(inputs varchar[])
RETURNS setof integer AS $$
DECLARE
input varchar;
result integer[];
BEGIN
FOREACH input IN ARRAY inputs LOOP
result := result || ARRAY(SELECT function_a(input));
END LOOP;
RETURN QUERY SELECT unnest(result);
END;
$$ LANGUAGE PLpgSQL;

关于arrays - 合并和返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54452412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com