2017-09-29 26 views
2

我想在CTE一次創建一組ID,並在多個ANYs使用它的陣列。但我在第一個卡住了。使用PG 9.3使用從CTE的SELECT ... WHERE ...任何

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a 
) 
SELECT 1 
WHERE 2 = ANY(SELECT a FROM x) 

我期望的是在ANY中的SELECT語句將返回以前創建的數組。相反,我得到這個錯誤:

ERROR: operator does not exist: integer = integer[]

LINE 6: WHERE 2 = ANY(SELECT a FROM x)

我不明白是什麼問題,因爲select語句應該返回一個數組,任何需要數組。

我當然不會造成熱膨脹係數的陣列和在任何每次動態創建它,但我認爲這將是一次創造它少高性能。我必須有一個數組,因爲ANY沒有數組會改變查詢計劃(當我在我的實際表上做這件事,而不是這個小例子)時,會導致性能降低。

+1

'ANY'返回數組,所有的權利。但是'2'確實是一個'integer []'還是一個簡單而簡單的'integer'? – waka

+0

爲什麼你想爲此使用數組?簡單的子查詢是標準的SQL方法。 –

+0

@GordonLinoff我上面說的,我得到一個標準的子查詢VS數組不同的查詢計劃,並且陣列計劃較好。 – eurotrash

回答

1

還有的ANY兩種形式。如果你想使用ANY(array expression):

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a 
) 

SELECT 1 
FROM x 
WHERE 2 = ANY(a) 

,或者如果你想使用ANY(subquery):

WITH x AS (
    SELECT * FROM generate_series(1, 10) AS a 
) 

SELECT 1 
WHERE 2 = ANY(SELECT a FROM x) 
+0

呃!第一個正是我想要做的......謝謝! – eurotrash

0

這樣做不使用數組正常的SQL方法:

WITH x AS (
     SELECT gs.a 
     FROM generate_series(1, 10)) AS gs(a) 
    ) 
SELECT 1 
WHERE 2 IN (SELECT a FROM x); 

當然,你可能想使用一個不同的原因陣列(如學習陣列)。但是您應該至少了解SQL解決此問題的方式。

+0

我理解這種方式,但它比使用'ANY(我的陣列)少高性能的'我的實際數據時。無論如何,無論如何,「IN」通常會變爲「ANY」,只要我有更多的值,但是在數組和行上使用ANY時,計劃會發生顯着變化。 – eurotrash