有人可以向我解释为什么第4选择有效,但前3有没有? (如果重要的话,我会使用PostgreSQL 9.3.4。)
drop table if exists temp_a;
create temp table temp_a as
(
select array[10,20] as arr
);
select 10 = any(select arr from temp_a); -- ERROR: operator does not exist: integer = integer[]
select 10 = any(select arr::integer[] from temp_a); -- ERROR: operator does not exist: integer = integer[]
select 10 = any((select arr from temp_a)); -- ERROR: operator does not exist: integer = integer[]
select 10 = any((select arr from temp_a)::integer[]); -- works
这是一个sqlfiddle:http://sqlfiddle.com/#!15/56a09/2
答案 0 :(得分:4)
你可能期待聚合。根据{{3}}:
注意:布尔聚合
bool_and
和bool_or
对应于标准SQL聚合every
和any
或some
。至于任何一些,似乎标准语法中都存在歧义:SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
如果子查询返回带有布尔值的行,则可以将ANY视为引入子查询或者作为聚合函数。因此,不能将标准名称赋予这些聚合。
在Postgres中,any
运算符存在documentation和for subqueries。
前三个查询返回一组int[]
类型的值,并将它们与int
进行比较。无法工作。
最后一个查询返回int[]
数组,但它只能正常工作,因为您返回了一个元素。
展览A;这有效:
select (select i from (values (array[1])) rows(i))::int[];
但这并不是:
select (select i from (values (array[1]), (array[2])) rows(i))::int[];
这可以作为结果(相当于您的第四个查询):
select 1 = any((select i from (values (array[1])) rows(i))::int[]);
但这并不是(相当于你的第四个查询返回多行):
select 1 = any((select i from (values (array[1]), (array[2])) rows(i))::int[]);
这些也应该有用,顺便说一下:
select 1 = any(
select unnest(arr) from temp_a
);
select 1 = any(
select unnest(i)
from (values (array[1]), (array[2])) rows(i)
);
另请注意array(select ...))
构造除外,因为它偶尔会得心应手:
select 1 = any(array(
select i
from (values (1), (2)) rows(i)
));
select 1 = any(
select i
from (values (1), (2)) rows(i)
);