Мне нужно изменить формат массива с [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);
мой тип данных не jsonb, это целое число []
Тогда как вы можете использовать оператор ->>?
Хорошо, тогда какой оператор мне нужно использовать?
Я думаю, вы немного неправильно поняли здесь массивы. Дело не в том, что «формат» любого массива
[1,2]. Это текстовое представление массива json, а{1,2}представляет собой обычный массив postgres. Они не называются разными «форматами» любого массива, как вы упомянули.