如何在 postgres 中创建一个一维数组,该数组只有一列填充给定的数组维度列和值

问题描述 投票: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
1个回答
0
投票

你很接近。您需要将实际元素类型传递给函数

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 一样。

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