Postgresql 在函数内的查询中使用 VARIADIC

end*_*ini 1 sql arrays postgresql postgresql-9.3

我想在 postgresql 上创建一个函数,它接收一个 bigint 数组(记录 ID),并使用“in”条件在查询中使用接收到的信息。

我知道我可以自己简单地进行查询,但这里的重点是我将创建该函数来执行一些其他验证和过程。

我试图使用的来源是这样的:

CREATE OR REPLACE FUNCTION func_test(VARIADIC arr bigint[])
RETURNS TABLE(record_id bigint,parent_id bigint)
AS $$ SELECT s.record_id, s.parent_id FROM TABLE s WHERE s.column in ($1);
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我收到以下错误:

ERROR:  operator does not exist: bigint = bigint[]
LINE 3: ...ECT s.record_id, s.parent_id FROM TABLE s WHERE s.column in ($1)
                                                                    ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

mu *_*ort 5

IN 不能像您认为的那样处理数组。IN 想要查看值列表

expression IN (value [, ...])
Run Code Online (Sandbox Code Playgroud)

或子查询:

expression IN (subquery)
Run Code Online (Sandbox Code Playgroud)

单个数组将满足第一个数组,但这种形式的 IN 将使用相等运算符 ( )将表达式与每个值进行比较=;但是,正如错误消息告诉您的那样,没有可以将 abigint与 a进行比较的相等运算符bigint[]。

您正在寻找ANY:

9.23.3. 任何/一些(阵列)

expression operator ANY (array expression)
expression operator SOME (array expression)
Run Code Online (Sandbox Code Playgroud)

右边是一个括号表达式,它必须产生一个数组值。使用给定的operator评估左侧表达式并将其与数组的每个元素进行比较,这必须产生布尔结果。ANY如果获得任何真结果,则结果为“真”。如果未找到真结果(包括数组具有零个元素的情况),则结果为“假”。

所以你想说:

WHERE s.column = any ($1)
Run Code Online (Sandbox Code Playgroud)

此外,您没有使用参数的名称,因此您不需要给它一个,只需:

CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...
Run Code Online (Sandbox Code Playgroud)

就足够了。如果你愿意,你可以把名字留在那里,它不会伤害任何东西。