Postgresql在函数内部的查询中使用变量

Postgresql在函数内部的查询中使用变量,sql,arrays,postgresql,postgresql-9.3,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.recor

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

如何修复此问题?

中的操作方式与您认为的阵列不同。我想看一个

或:

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

您正在寻找:

9.23.3。任何/部分(阵列)

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

所以你想说:

WHERE s.column = any ($1)
此外,您没有使用参数的名称,因此不需要为其指定名称,仅此:

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

这就足够了。如果愿意,您可以将名称保留在那里,它不会有任何影响。

IN与数组的工作方式与您认为的不同。我想看一个

或:

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

您正在寻找:

9.23.3。任何/部分(阵列)

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

所以你想说:

WHERE s.column = any ($1)
此外,您没有使用参数的名称,因此不需要为其指定名称,仅此:

CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...
这就足够了。如果你愿意,可以把名字留在那里,这不会有任何伤害。

谢谢!成功了。“任何”是如何工作的?对于数组的每次出现,它将复制条件?复制查询?
a=any(数组[1,2,3])
或多或少是
a=1或a=2或a=3的缩写。大概表达式只计算一次,然后与数组的每个元素进行比较。谢谢!成功了。“任何”是如何工作的?对于数组的每次出现,它将复制条件?复制查询?
a=any(数组[1,2,3])
或多或少是
a=1或a=2或a=3的缩写。该表达式大概只计算一次,然后与数组的每个元素进行比较。
CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...