Это возможно возможно с одной функцией с использованием модификатора VARIADIC
:
CREATE OR REPLACE FUNCTION get_subordinates(VARIADIC inp_persona_ids int[])
RETURNS TABLE (persona_id int) AS
$func$
WITH RECURSIVE children AS ( -- passed in persona_id
SELECT id AS persona_id, manager_id, disabled
FROM personas
WHERE id = ANY(inp_persona_ids)
UNION ALL -- and all subordinates
SELECT p.id AS persona_id
, p.manager_id
FROM children c
JOIN personas p ON p.manager_id = c.persona_id
)
SELECT c.persona_id
FROM children c
WHERE c.disabled IS NOT TRUE
$func$ LANGUAGE sql;
Но вам нужно добавить ключевое слово VARIADIC
в вызове при предоставлении массива вместо списка:
SELECT * FROM get_subordinates(VARIADIC '{1,2,3}'::int[]);
SELECT * FROM get_subordinates(1,2,3);
SELECT * FROM get_subordinates(1);
Если это не вариант, вы вернетесь к перегрузке функции, как предложено в другом ответе.
См .:
В сторону
- Похоже, это может быть более простая функция SQL.
UNION
не имеет смысла.Дубликаты могут возникать только в том случае, если ваше дерево идет по кругу, что создает бесконечный цикл, и rCTE выдает ошибку.Использовать более дешевые UNION ALL
. LEFT JOIN
не имело смысла.Добавление WHERE
заставило его вести себя как обычный [INNER] JOIN
в любом случае. - Но полностью удалить объединение и получить столбец
disabled
внутри rCTE.