#sql #arrays #postgresql
Вопрос:
Я создал функцию, которая принимает json. Вот запрос
CREATE OR REPLACE FUNCTION public.data_get( data json) RETURNS SETOF json LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE ROWS 1000 AS $BODY$ DECLARE declare _text text; BEGIN -- get fields data from json - https://www.postgresql.org/docs/9.3/functions-json.html _text = data::json#gt;gt;'{text}';
и вот как я называю эту функцию
select * from data_get ('{"text":"my"}'::json) as info;
и это прекрасно работает
теперь я хочу передать элемент массива, поэтому я добавил переменные следующим образом
DECLARE declare _text text; _ids bigint[];
и доступ из json такой
_ids = data::json#gt;gt;'{ids}';
но когда я вызываю эту функцию
select * from data_get ('{"text":"","ids":[1]}'::json) as info;
это показывает
ERROR: malformed array literal: "[1]" DETAIL: Missing "=" after array dimensions. CONTEXT: PL/pgSQL function posts_get(json) line 18 at assignment SQL state: 22P02
как я могу вызвать эту функцию?
Ответ №1:
Postgres не выполняет неявное преобразование из массива json в массив postgres.
Вам нужно использовать собственную функцию:
CREATE OR REPLACE FUNCTION public.json_to_int_array(json) RETURNS integer[] LANGUAGE sql AS $function$ SELECT array_agg(v::int) FROM json_array_elements_text($1) g(v) $function$ postgres=# SELECT public.json_to_int_array(('{"text":"","ids":[1, 2, 3]}'::json)-gt;'ids'); ┌───────────────────┐ │ json_to_int_array │ ╞═══════════════════╡ │ {1,2,3} │ └───────────────────┘ (1 row)