我想创建一个函数,给定任何类型的值、一维数组的维度和要设置的列,将返回一个一维数组,该数组的所有值都为空,除了要设置的给定列的值到给定的值。 问题是:是否可以让函数返回变量类型结果? 是否可以创建变量类型临时变量?下面的代码是我尝试创建的代码,但它不起作用。
create function arraycol(v anyelement,n int,i int) returns anyarray language plpgsql as $$
declare r anyarray;
begin
r=array_fill(null,array[n]);
r[i]=v;
return r;
end $$;
你很接近。您需要将实际元素类型传递给函数
array_fill()
。未键入的 null
是不行的。使用 (NULLIF(v, v)
生成输入类型的空值:
CREATE OR REPLACE FUNCTION arraycol (v anyelement, n int, i int, OUT r anyarray)
LANGUAGE plpgsql AS
$func$
BEGIN
r = array_fill(NULLIF(v, v), ARRAY[n]);
-- if i > n then this assignment auto-fills positions in between with null
r[i] = v;
END
$func$;
不带
array_fill()
的等效变体:
CREATE OR REPLACE FUNCTION arraycol2 (v anyelement, n int, i int, OUT r anyarray)
LANGUAGE plpgsql AS
$func$
BEGIN
r[1] := NULLIF(v, v);
r[i] = v; -- auto-fills positions in between with NULL
IF n > i THEN
r[n] = NULLIF(v, v);
END IF;
END
$func$;
当然,我会检查是否有合理的输入值。就像强制尺寸输入 > 1 一样。