函数中的 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);
我需要将数组格式从 [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);