Форматирование массива PostgreSQL в функциях - PullRequest
1 голос
/ 25 апреля 2019

Мне нужно изменить формат массива с [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

Так что я делаю не так?

EDIT с помощью @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;

Сейчас работает

1 Ответ

1 голос
/ 25 апреля 2019

Есть некоторые заблуждения:

  • 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);
...