2
SELECT UNNEST(ARRAY[1,2,3,4]) 

在執行上述查詢我得到這樣的錯誤存在:ERROR:功能UNNEST(整數[])不PostgreSQL中

ERROR: function unnest(integer[]) does not exist in postgresql. 

我使用的PostgreSQL 8.3和我已經安裝了_int.sql在我的數據包中進行整數數組操作。

如何解決此錯誤?

回答

6

unnest()不是模塊intarray的一部分,而是標準PostgreSQL的一部分。但是,你爲need version 8.4 or later

因此,您可以通過升級到更新版本(最好是當前版本9.1)來解決此問題。請參閱versioning policy of the PostgreSQL project

如果您應該使用Heroku的共享數據庫(目前使用8.3版本),他們也在考慮升級。 Heroku Labs already offers 9.1


由於@Abdul評論,你可以實現一個窮人的unnest()在版本8.4的PostgreSQL自己面前:

CREATE OR REPLACE FUNCTION unnest(anyarray) 
    RETURNS SETOF anyelement AS 
$BODY$ 
    SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i; 
$BODY$ LANGUAGE sql IMMUTABLE; 

但是,請注意,這僅適用於一維數組。 (與PostgreSQL的unnest()這需要與多個維度數組):

SELECT unnest('{1,2,3,4}'::int[]) -- works 
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs) 

可以實現更多的功能的n維數組:

CREATE OR REPLACE FUNCTION unnest2(anyarray) -- for 2-dimensional arrays 
    RETURNS SETOF anyelement AS 
$BODY$ 
SELECT $1[i][j] 
FROM (
    SELECT i, generate_series(array_lower($1,2), array_upper($1,2)) j 
    FROM (
     SELECT generate_series(array_lower($1,1), array_upper($1,1)) i 
     ) x 
    ) y; 
$BODY$ LANGUAGE sql IMMUTABLE; 

電話:

SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works! 

你也可以編寫一個處理多維度的PL/pgSQL函數...

+1

感謝您的回覆。 (CREATE OR REPLACE FUNCTION UNNEST(anyarray的) RETURNS SETOF爲anyelement AS $ BODY $ SELECT 1 $ [I] FROM generate_series(array_lower($ 1,1), array_upper(1,1 $))I; $ BODY $ LANGUAGE'sql'IMMUTABLE) 通過創建像這樣的函數我在postgresql中實現了unnest函數8.3 – Rafiu 2012-01-12 06:05:59

+1

@AbdulRafiu:是的,應該這樣做。我將你的評論納入了我的答案,並加了一點。 – 2012-01-12 06:47:51

+0

Brandstetter:謝謝你。 – Rafiu 2012-01-12 07:29:55