2014-09-01 66 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); 
根據您的回答
相關問題