PostgreSQL добавить каждый элемент в список - функции БД - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы создать функцию БД, которая будет принимать список чисел и возвращать список чисел. Для каждого элемента в списке, который был передан функции, она должна проверить какое-то условие и добавить его в список ответов. Однако я не думаю, что способ, которым я пытаюсь это сделать, действительно правильный. То, что я пытался написать, это в основном псевдокод.

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
returns integer[]
AS 
$BODY$
   DECLARE return_list integer[];

   FOREACH field IN ARRAY numbers LOOP
      CASE
         WHEN field = 3 THEN -- add 43 (this was a random thought, but I am basically trying to map a few of the numbers to different values)
      END
   END LOOP;

RETURN QUERY SELECT * FROM return_list;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

1 Ответ

0 голосов
/ 04 августа 2020

Вам нужно поместить это в оператор IF. Чтобы добавить значение в массив, используйте ||

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
returns integer[]
AS 
$BODY$
DECLARE 
  return_list integer[] := integer[];
BEGIN
  FOREACH field IN ARRAY numbers LOOP
    if field = 3 then 
      return_list := return_list || 43;
    elsif field = 15 then 
      return_list := return_list || 42;
    else
      return_list := return_list || field;
    end if;
  END LOOP;
  return return_list; --<< no SELECT required, just return the variable
END;  
$BODY$
LANGUAGE plpgsql --<< you need PL/pgSQL, not SQL for the above
STABLE;

Это также можно сделать, используя SQL вместо PL / pg SQL, что обычно более эффективно:

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
  returns integer[]
AS 
$BODY$
  select array_agg(field order by idx)
  from (
    select case 
              when field = 3 then 43
              when field = 15 then 42
              else field
           end as field,
           idx
    from unnest(numbers) with ordinality as t(field, idx)
  ) x;
$BODY$
LANGUAGE sql 
STABLE;
...