运算符不存在:integer = integer [] plpgsql错误

时间:2016-05-13 07:40:39

标签: sql arrays plpgsql

我遇到运营商不存在的问题,  我尝试执行查询时出现integer = integer[] error

select staff
from affiliations
where orgUnit = any (select unnest(*) from get_ou(661));

函数get_ou(661)返回一个整数数组。我想知道为什么我不能使用= any从阵列中的任何组织中获取工作人员。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

与subselect一起使用的 ANY 谓词可确保将值与subselect返回的任何值进行比较。

postgres=# SELECT * FROM foo_table;
┌────┬───┐
│ id │ x │
╞════╪═══╡
│  1 │ 9 │
│  2 │ 4 │
│  3 │ 1 │
│  4 │ 3 │
│  5 │ 7 │
│  6 │ 5 │
│  7 │ 3 │
│  8 │ 8 │
│  9 │ 3 │
│ 10 │ 8 │
└────┴───┘
(10 rows)

CREATE OR REPLACE FUNCTION public.foo(VARIADIC integer[])
 RETURNS integer[]
 LANGUAGE sql
AS $function$ SELECT $1 $function$

很奇怪,你的例子坏了(但语法错误)。当我修复它时,它正在工作:

postgres=# SELECT * FROM foo_table 
             WHERE x = ANY(SELECT unnest(v) FROM foo(3,8) g(v));
┌────┬───┐
│ id │ x │
╞════╪═══╡
│  4 │ 3 │
│  7 │ 3 │
│  8 │ 8 │
│  9 │ 3 │
│ 10 │ 8 │
└────┴───┘
(5 rows)

您应该更改语法并从subselect移动到数组表达式(此解决方案应该首选用于此目的):

postgres=# SELECT * FROM foo_table WHERE x = ANY(foo(3,8));
┌────┬───┐
│ id │ x │
╞════╪═══╡
│  4 │ 3 │
│  7 │ 3 │
│  8 │ 8 │
│  9 │ 3 │
│ 10 │ 8 │
└────┴───┘
(5 rows)