我希望在postgresql上创建一个函数,该函数接收bigint数组(记录in),并使用"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.我怎么才能解决这个问题?
发布于 2014-03-11 22:54:38
IN不像你想的那样适用于数组。想要看到一个值列表
expression IN (value [, ...])或者是子查询
expression IN (subquery)单个数组将满足第一个数组,但该形式的IN将使用相等运算符(=)将表达式与每个值进行比较;但是,正如错误消息告诉您的那样,没有一个相等运算符可以将bigint与bigint[]进行比较。
你在找任何
9.23.3.任意/部分(数组) 表达式运算符任意(数组表达式)表达式运算符(数组表达式) 右边是带括号的表达式,它必须产生数组值.使用给定的运算符计算左表达式并将其与数组的每个元素进行比较,这必须产生一个布尔结果。如果获得任何真结果,则
ANY的结果为" true“。如果没有找到真正的结果,则结果是"false“(包括数组有零个元素的情况)。
所以你想说:
WHERE s.column = any ($1)而且,您没有使用参数的名称,所以不需要给它一个名称,只需要这样:
CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...就足够了。你可以把名字留在那里如果你愿意的话,它不会伤害任何东西。
https://stackoverflow.com/questions/22337034
复制相似问题