Postgres 9.6:returns 字符串数组的函数

Postgres 9.6 : Function that returns array of strings

我正在尝试创建 return text/varchar 类型数组的函数。这是一个例子:

CREATE OR REPLACE FUNCTION schema.someFunction(text, text, text)
 RETURNS character varying[]
 LANGUAGE plpgsql
AS $function$
DECLARE
   i text;
   arr_len varchar[];
BEGIN
FOR i in (select string_to_array(,','))
LOOP
   arr_len := schema.someOtherFunctionThatReturnsText(i::text, , )::varchar;
END LOOP;
RETURN arr_len;
END
$function$
;

此函数始终 returns NULL 行。我不明白为什么。有什么建议吗?

只是提一下 schema.someOtherFunctionThatReturnsText return 的文字,它工作正常。

This function returns NULL rows all the time. I don't get it why.

您在每次迭代时都覆盖了 arr_len 的值。当您将标量值(单个 text 值)分配给数组时,该函数的工作原理让我感到非常惊讶 - 实际上应该抛出一个错误,除非该函数 returns 一个文本数组(text[]) 而不是 text 正如混淆的名字所暗示的那样。

您还错误地使用了 FOR 循环。 select string_to_array() 只是 returns 一个单独的数组,它不会遍历数组。另外,变量应该是一条记录,而不是 text 变量。

loop over array elements,你需要使用FOREACH,而不是带有select的FOR循环。然后您需要将函数调用的结果附加到结果变量。但是为了让它工作,你需要先初始化变量。

CREATE OR REPLACE FUNCTION some_function(text, text, text)
 RETURNS text[]
 LANGUAGE plpgsql
AS $function$
DECLARE
   i text;
   arr_len text[] := array[]::text[]; -- initialize the array
BEGIN
  FOREACH i in ARRAY string_to_array(p_elements,',')
  LOOP
     arr_len := arr_len || schema.someotherfunctionthatreturnstext(i::text, , ));
  END LOOP;

  RETURN arr_len;
END
$function$
;

但是你把整个事情复杂化了。

为此您不需要循环或 PL/pgSQL:

只需取消嵌套您获得的数组并使用 array_agg() 到 assemble 结果:

CREATE OR REPLACE FUNCTION schema.some_function(text, text, text)
 RETURNS text[]
 LANGUAGE sql
AS 
$function$
   select array_agg(schema.someotherfunctionthatreturnstext(x.element, , )::text)
   from unnest(string_to_array(,',')) as x(element);
$function$
;

最好使用适当的数组类型(例如 text[])声明参数,而不是依赖逗号分隔的文本值。请使用参数名称而不是 </code> 或 <code> 以便整个函数更易于阅读(和维护)