函数中的 PostgreSQL 数组格式

PostgreSQL array formatting in functions

我需要将数组格式从 [1,2] 更改为 {1,2}

我为此写了一个函数:

CREATE OR REPLACE FUNCTION core.format_array(
    parray integer[])
    RETURNS integer[]
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$
DECLARE
    arrayValue    integer[];        
-- select core.format_array(Array [1,2]);
BEGIN

    begin
      select parray into arrayValue;
    end;
    RETURN arrayValue;
END
$BODY$;

我想在另一个函数中使用这个函数,如下所示:

{"test":[1,2]}//passing the array

test = params ->> 'test';
select core.format_array(ARRAY test::int[]) into test;

我什至无法保存显示此错误的函数

ERROR:  syntax error at or near "test"

LINE 22:  select core.format_array(ARRAY test::int[]) into test;

由于变量前面不能用Array,所以去掉了:

select core.format_array(test::int[]) into test;

这次函数保存成功,但是查询输出显示异常:

INFO:  Error Name:malformed array literal: "[1,2]"
INFO:  Error State:22P02

所以我做错了什么?

编辑 在@Laurenz Albe 的帮助下,我稍微改变了我的功能

CREATE OR REPLACE FUNCTION core.format_array(
    parray text)
    RETURNS integer[]
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$
DECLARE
    arrayValue    integer[];        
-- select core.format_array('[1,2]');
BEGIN

    begin
    SELECT array_agg(x)::int[] into arrayValue
FROM jsonb_array_elements_text(parray::jsonb) AS x(x);
      --select parray into arrayValue;
    end;
    RETURN arrayValue;
END
$BODY$;

我将值传递为 {"test":"[1,2]"}

select core.format_array( params ->> 'test') into test;

现在可以使用了

有一些误解:

  • jsonb 数组不同于 PostgreSQL 数组类型,例如 integer[]

  • jsonb 数组的文本表示是 [1,2],而 integer[] 表示为 {1,2}

这就解释了你的问题。

作为解决方案,请考虑使用

SELECT array_agg(x)::text INTO textvar
FROM jsonb_array_elements_text(params->'test') AS x(x);