首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对函数内部的查询使用VARIADIC的Postgresql

对函数内部的查询使用VARIADIC的Postgresql
EN

Stack Overflow用户
提问于 2014-03-11 21:29:25
回答 1查看 1.7K关注 0票数 1

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

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

我想要使用的消息来源如下:

代码语言:javascript
复制
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;

使用上述代码,我将收到以下错误:

代码语言:javascript
复制
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.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 22:54:38

IN不像你想的那样适用于数组。想要看到一个值列表

代码语言:javascript
复制
expression IN (value [, ...])

或者是子查询

代码语言:javascript
复制
expression IN (subquery)

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

你在找任何

9.23.3.任意/部分(数组) 表达式运算符任意(数组表达式)表达式运算符(数组表达式) 右边是带括号的表达式,它必须产生数组值.使用给定的运算符计算左表达式并将其与数组的每个元素进行比较,这必须产生一个布尔结果。如果获得任何真结果,则ANY的结果为" true“。如果没有找到真正的结果,则结果是"false“(包括数组有零个元素的情况)。

所以你想说:

代码语言:javascript
复制
WHERE s.column = any ($1)

而且,您没有使用参数的名称,所以不需要给它一个名称,只需要这样:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION func_test(VARIADIC bigint[]) ...

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22337034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档