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