2014-09-01 79 views
11

我经常使用integer = ANY(integer[])语法,但现在ANY运算符不起作用。这是我第一次使用它来比较标量与从CTE返回的整数,但我认为这不应该导致问题。运算符在任何查询中都不存在:integer = integer []

我的查询:

WITH bar AS (
    SELECT array_agg(b) AS bs 
    FROM foo 
    WHERE c < 3 
) 
SELECT a FROM foo WHERE b = ANY (SELECT bs FROM bar); 

当我运行它,它会引发以下错误:在这个SQL Fiddle

ERROR: operator does not exist: integer = integer[]: WITH bar AS ( SELECT array_agg(b) AS bs FROM foo WHERE c < 3) SELECT a FROM foo WHERE b = ANY (SELECT bs FROM bar)

详细信息。

那么我做错了什么?

回答

11

基于该错误消息部分operator does not exist: integer = integer[],看来该bs柱必须unnest版,为了得到右侧回一个integer所以比较运算符,可以发现:

WITH bar AS (
    SELECT array_agg(b) AS bs 
    FROM foo 
    WHERE c < 3 
) 
SELECT a 
FROM foo 
WHERE b = ANY (SELECT unnest(bs) FROM bar); 

这将导致输出:

A 
2 
3 

鉴于该ANY function商务部:

The right-hand side is a parenthesized subquery, which must return exactly one column. The left-hand expression is evaluated and compared to each row of the subquery result using the given operator, which must yield a Boolean result. The result of ANY is "true" if any true result is obtained. The result is "false" if no true result is found (including the case where the subquery returns no rows).

...错误是有道理的,因为左侧的表达式是一个integer - b柱 - 而右边的表达式是integer S或integer[]阵列,并且因此比较结束形式为integer = integer[],它没有运算符,因此会导致错误。

unnest ing integer[]值使得左右手表达式integer s,因此比较可以继续。

修改SQL Fiddle

注意:表示使用IN而不是= ANY时可看到相同的行为。

+8

附加说明:由于'1 = ANY(ARRAY [1,2,3])'是合法的,是合理的也期待'1 = ANY(SELECT ARRAY [1,2,3])'是合法的,但这不是因为那会造成你是否想要'1 = ARRAY [1,2,3]'或'1 = 1 OR 1 = 2或1 = 3',解析器不够聪明,只能确定一个是合法的。你可以告诉它,你真的想要1 = ANY((SELECT ARRAY [1,2,3]):: int [])'(我会这样做而不是'unnest')的数组 - 任何形式。 – 2014-09-01 08:09:22

+0

啊,有趣。感谢您的额外细节。 – khampson 2014-09-01 08:11:01

+0

@CraigRinger:谢谢!肯的​​回答帮助我如何正确地做,但你的评论让我明白为什么我的查询是错误的。 – 2014-09-01 08:25:24

0

柱必须UNNEST

与酒吧

AS( SELECT ARRAY_AGG(B)作为BS FROM FOO 其中C ) 选择一个 FROM FOO 其中B = ANY(SELECT UNNEST( bs)FROM bar);

+1

这与现有的答案有何不同? – 2015-11-30 07:09:48

0

没有UNNEST

WITH bar AS (
    SELECT array_agg(b) AS bs 
    FROM foo 
    WHERE c < 3 
) 
SELECT a FROM foo WHERE (SELECT b = ANY (bs) FROM bar); 
根据您的回答
相关问题