Arrays PostgreSQL函数如何为同一函数接受整数或整数数组?

Arrays PostgreSQL函数如何为同一函数接受整数或整数数组?,arrays,postgresql,types,plpgsql,postgresql-9.6,Arrays,Postgresql,Types,Plpgsql,Postgresql 9.6,我在Postgres 9.6中有一个函数,它接受int[]参数。我想让函数也接受一个int(并在必要时将其转换为一个元素数组) 如何更改函数定义并添加一些条件逻辑来测试int,并在必要时更改为ARRAY[int],但您可以使用整数参数重载函数,并将其作为数组传递给现有函数: 创建或替换函数get\u下属(inp\u persona\u id整数) 将表(persona_id int)返回为 $$ 开始 从get_下属返回查询SELECT*(数组[inp_persona_id]); 结束; $$语

我在Postgres 9.6中有一个函数,它接受
int[]
参数。我想让函数也接受一个int(并在必要时将其转换为一个元素数组)


如何更改函数定义并添加一些条件逻辑来测试
int
,并在必要时更改为
ARRAY[int]
,但您可以使用
整数
参数重载函数,并将其作为数组传递给现有函数:

创建或替换函数get\u下属(inp\u persona\u id整数)
将表(persona_id int)返回为
$$
开始
从get_下属返回查询SELECT*(数组[inp_persona_id]);
结束;
$$语言plpgsql;
也许您还想对照
NULL
,检查参数,这取决于您。

使用
变量
修饰符的单个函数可以

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函数
  • 联合
    毫无意义。重复只能发生在你的树成圆圈的情况下,这将创建一个无休止的循环,并且rCTE将出错。使用更便宜的
    UNION ALL
  • 左连接
    没有意义。添加的
    WHERE
    强制其行为类似于普通的
    [内部]连接
  • 但是,完全删除连接并检索rCTE内的列
    disabled

期望上游调用方对数组使用variadic是行不通的,因此这里的解决方案是重载。示例中的简化有助于提高可读性和性能。谢谢你。
SELECT * FROM  get_subordinates(VARIADIC '{1,2,3}'::int[]);
SELECT * FROM  get_subordinates(1,2,3);
SELECT * FROM  get_subordinates(1);