Arrays PostgreSQL函数如何为同一函数接受整数或整数数组?
我在Postgres 9.6中有一个函数,它接受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]); 结束; $$语
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
SELECT * FROM get_subordinates(VARIADIC '{1,2,3}'::int[]);
SELECT * FROM get_subordinates(1,2,3);
SELECT * FROM get_subordinates(1);