Để có được lát đầu tiên của một mảng:
SELECT my_arr[1:1];
Mảng kết quả có kích thước mảng giống nhau làm đầu vào.
Chi tiết trong câu trả lời trước đây của tôi tại đây:
- Mảng không tốt nhất theo một cấp độ
Để làm phẳng kết quả:
SELECT ARRAY(SELECT unnest(my_arr[1:1]));
Hoặc sạch hơn:
SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));
Ví dụ
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];
Kết quả:
{{1,2,3}} -- 2D array
Hoặc:
SELECT ARRAY(
SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
);
Kết quả:
{1,2,3} -- 1D array
Giả lập unnest()
trong Postgres 8.3
Phản hồi cho nhận xét của bạn:
Trang Wiki mà bạn đang liên kết đến có một chút sai lệch. Tôi đã cập nhật nó bằng mã cho mảng 2 chiều.
unnest()
cho mảng 1 chiều:
CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
RETURNS SETOF anyelement AS
$func$
SELECT $1[i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) i
$func$ LANGUAGE sql IMMUTABLE;
unnest()
cho mảng 2 chiều:
CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
RETURNS SETOF anyelement AS
$func$
SELECT $1[d1][d2]
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
$func$ LANGUAGE sql IMMUTABLE;
Hàm tổng hợp array_agg()
không được cài đặt theo mặc định trong Postgres 8.3:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC = array_append,
STYPE = anyarray,
INITCOND = '{}'
);
Bỏ kết hợp mảng 2d thành mảng 1d:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
GROUP BY d1
ORDER BY d1
$func$ LANGUAGE sql IMMUTABLE;
SQL Fiddle.