如何生成一个给定大小的数组,并填充一个字段?

问题描述 投票:0回答:1

我想创建一个函数,给定任何类型的值、一维数组的维度和要设置的列,将返回一个用空值填充的一维数组,除了给定位置的一个给定值之外.

下面的代码是我尝试创建的代码,但它不起作用:

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 $$;

是否可以让函数返回多态数组类型?

是否可以创建多态元素类型的变量?

arrays postgresql polymorphism plpgsql
1个回答
0
投票

你很接近。

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。

© www.soinside.com 2019 - 2024. All rights reserved.