Postgres任何在子查询中选择数组的运算符

时间:2014-12-12 00:38:47

标签: postgresql

有人可以向我解释为什么第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

1 个答案:

答案 0 :(得分:4)

你可能期待聚合。根据{{​​3}}:

  

注意:布尔聚合bool_andbool_or对应于标准SQL聚合everyanysome。至于任何一些,似乎标准语法中都存在歧义:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
     

如果子查询返回带有布尔值的行,则可以将ANY视为引入子查询或者作为聚合函数。因此,不能将标准名称赋予这些聚合。

在Postgres中,any运算符存在documentationfor 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)
           );