unnest()
không phải là một phần của mô-đun intarray
, nhưng là PostgreSQL tiêu chuẩn. Tuy nhiên, bạn cần phiên bản 8.4 trở lên
cho điều đó.
Vì vậy, bạn có thể giải quyết vấn đề này bằng cách nâng cấp lên phiên bản mới hơn, tốt nhất là phiên bản 9.1 hiện tại. Xem chính sách lập phiên bản của dự án PostgreSQL .
Nếu bạn nên sử dụng cơ sở dữ liệu được chia sẻ của Heroku, hiện đang sử dụng phiên bản 8.3, họ cũng đang xem xét nâng cấp. Heroku Labs đã cung cấp 9.1 .
Như @Abdul đã nhận xét, bạn có thể triển khai unnest()
của một người nghèo trong các phiên bản trước PostgreSQL 8.4:
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;
Tuy nhiên, hãy lưu ý rằng điều này chỉ hoạt động đối với mảng một chiều . (Trái ngược với unnest()
của PostgreSQL lấy mảng có nhiều thứ nguyên):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Bạn có thể triển khai nhiều hàm hơn cho mảng n-chiều:
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;
Gọi:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Bạn cũng có thể viết một hàm PL / pgSQL xử lý nhiều thứ nguyên ...