1

我想在 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;

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

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.

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

4

1 回答 1

5

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

expression IN (value [, ...])

子查询

expression IN (subquery)

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

您正在寻找任何

9.23.3。任何/一些(数组)

expression operator ANY (array expression)
expression operator SOME (array expression)

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

所以你想说:

WHERE s.column = any ($1)

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

CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...

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

于 2014-03-11T22:54:38.250 回答