PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Không tốt nhất mảng theo một cấp độ

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python Postgres psycopg2 ThreadedConnectionPool đã cạn kiệt

  2. So sánh các tùy chọn cơ sở dữ liệu đám mây cho PostgreSQL

  3. Cách thay đổi người dùng thành Superuser trong PostgreSQL

  4. Thêm ngày vào một ngày trong PostgreSQL

  5. Sử dụng COALESCE để xử lý các giá trị NULL trong PostgreSQL