Giải thích
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
trả về giống như
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
là NULL. Tôi trích dẫn các tài liệu về vấn đề đó:
Theo mặc định, giá trị chỉ mục giới hạn dưới của các thứ nguyên của mảng được đặt thành một.
0
không có ý nghĩa đặc biệt ở đây. Ngoài ra, với mảng hai chiều, bạn cần hai chỉ mục để có được một phần tử cơ sở. Như thế này:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Kết quả:
2
Phần đầu tiên của thông điệp của bạn hơi không rõ ràng.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Kết quả:
[1:3][1:3]
Đó là hai thứ nguyên có 3 phần tử (1 đến 3) mỗi phần tử (9 phần tử cơ sở).
Nếu bạn muốn n-1
thì đây là kết quả chính xác:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Kết quả:
{1,2,3,4,5,6,7,8,9}
Đó là một kích thước. unnest()
luôn tạo ra một phần tử cơ sở trên mỗi hàng. Tôi không chắc chắn những gì bạn mong muốn chính xác kết quả. Ví dụ của bạn chỉ là một mảng 2 chiều khác có thiếu bộ dấu ngoặc nhọn ...?
{1,2,3}, {4,5,6}, {7,8,9}
Nếu bạn muốn có một phần của mảng , hãy thử ký hiệu này:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Kết quả:
{{1,2,3},{4,5,6}}
Hoặc cái này:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Kết quả:
{{4,5}}
Để làm phẳng kết quả (lấy mảng 1D):
- Cách chọn mảng 1d từ mảng 2d postgresql
Đọc thêm hướng dẫn tại đây.
Chức năng
Thử nghiệm sau đó cho thấy rằng hàm plpgsql này nhiều nhanh hơn. Yêu cầu Postgres 9.1 trở lên:
CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
RETURNS SETOF ANYARRAY AS
$func$
BEGIN
FOREACH a SLICE 1 IN ARRAY $1 LOOP
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql IMMUTABLE;
Xem:
- Làm cách nào để tách mảng 2d thành mảng 1d một cách nhanh chóng trong PostgreSQL?
Đây là phiên bản cải tiến và đơn giản hóa của hàm mà Lukas đã đăng:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM generate_subscripts($1,1) d1
, generate_subscripts($1,2) d2
GROUP BY d1
ORDER BY d1
$func$ LANGUAGE sql IMMUTABLE;
Đối với các phiên bản Postgres <8.4, array_agg()
không được cài đặt theo mặc định. Tạo nó trước:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Ngoài ra, generate_subscripts()
vẫn chưa được sinh ra. Sử dụng thay thế:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
Gọi:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Kết quả
{1,2}
{3,4}
{5,6}
SQL Fiddle.