передача массива в качестве пары ключей в формате json для функции pgsql

#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)