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)
我怎样才能解决这个问题?
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. 任何/一些(阵列)
Run Code Online (Sandbox Code Playgroud)expression operator ANY (array expression) expression operator SOME (array expression)右边是一个括号表达式,它必须产生一个数组值。使用给定的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)
就足够了。如果你愿意,你可以把名字留在那里,它不会伤害任何东西。
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |