我想创建一个函数,给定任何类型的值、一维数组的维度和要设置的列,将返回一个用空值填充的一维数组,除了给定位置的一个给定值之外.
下面的代码是我尝试创建的代码,但它不起作用:
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 $$;
是否可以让函数返回多态数组类型?
是否可以创建多态元素类型的变量?
你很接近。
r anyarray;
不是声明多态输入类型 anyarray
变量的有效语法。要声明多态输入类型的变量,请使用 %TYPE
构造:
DECLARE
array_element v%TYPE;
不幸的是,在这种情况下,我们只有一个类型为
anyelement
的参数可供使用,这使得它变得棘手。参见:
我使用
OUT
参数或输入 anyarray
来简化。
array_fill()
。未输入的 null
是不行的。为了完全跳过变量声明,我使用 NULLIF(v, v)
: 临时生成类型化空值
CREATE OR REPLACE FUNCTION arraycol (v anyelement, n int, i int, OUT r anyarray)
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE 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()
的等效变体。在作业中,非类型化 null 有效:
CREATE OR REPLACE FUNCTION arraycol (v anyelement, n int, i int, OUT r anyarray)
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE AS
$func$
BEGIN
r[1] := null; -- assuming 1-based indexes!
r[i] := v; -- auto-fills positions in between with null
IF n > i THEN
r[n] := null;
END IF;
END
$func$;
同样的调用,同样的结果。示例:
SELECT arraycol (1, 3, 2);
数组列 |
---|
{空,1,空} |
当然,我会进行检查以强制执行合理的输入。例如,强制尺寸输入 > 1。