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函数...
感谢您的回复。 (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
@AbdulRafiu:是的,应该这样做。我将你的评论纳入了我的答案,并加了一点。 – 2012-01-12 06:47:51
Brandstetter:谢谢你。 – Rafiu 2012-01-12 07:29:55