Форматирование массива PostgreSQL в функциях

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

Теперь это работает

Я думаю, вы немного неправильно поняли здесь массивы. Дело не в том, что «формат» любого массива [1,2] . Это текстовое представление массива json, а {1,2} представляет собой обычный массив postgres. Они не называются разными «форматами» любого массива, как вы упомянули.

Kaushik Nayak 25.04.2019 07:51
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
307
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • 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, это целое число []

Sanooj T 25.04.2019 07:53

Тогда как вы можете использовать оператор ->>?

Laurenz Albe 25.04.2019 08:04

Хорошо, тогда какой оператор мне нужно использовать?

Sanooj T 25.04.2019 09:10

Другие вопросы по теме