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

Mảng ban đầu trong chức năng tổng hợp mảng đa chiều

Postgres 9.5 trở lên

... đi kèm với một biến thể bổ sung của hàm tổng hợp array_agg() . Hướng dẫn sử dụng:

mảng đầu vào được nối thành mảng có một chiều cao hơn (tất cả các đầu vào phải có cùng chiều và không được để trống hoặc rỗng)

Vì vậy, không hoàn toàn giống với hàm tổng hợp tùy chỉnh array_agg_mult() phía dưới. Nhưng hãy sử dụng nó, nếu bạn có thể. Nó nhanh hơn.

Có liên quan:

  • Cách sắp xếp mảng int hai chiều trong PostgreSQL?

Postgres 9.4 trở lên

Hàm tổng hợp cho bất kỳ kiểu mảng

Với kiểu đa hình anyarray nó hoạt động cho tất cả các loại mảng (bao gồm integer[] ):

CREATE AGGREGATE array_agg_mult (anyarray) (
   SFUNC     = array_cat
 , STYPE     = anyarray
 , INITCOND  = '{}'
);

Như @Lukas đã cung cấp, hàm tùy chỉnh arrayappend() là không cần thiết. Tích hợp sẵn array_cat() Làm công việc. Tuy nhiên, điều đó không giải thích được tại sao Ví dụ của bạn không thành công, trong khi câu trả lời trong câu trả lời của Lukas hoạt động. Sự khác biệt có liên quan là Lukas đã lồng mảng vào một lớp mảng khác với array[d.a] .

Bạn vượt qua giả định không chính xác rằng bạn có thể khai báo một loại int[][] . Nhưng bạn không thể:int[][] cùng một loại dưới dạng int[] cho hệ thống kiểu PostgreSQL. Chương về các kiểu mảng trong sách hướng dẫn giải thích:

Việc triển khai hiện tại cũng không thực thi số thứ nguyên đã khai báo. Mảng của một loại phần tử cụ thể được coi là cùng loại, bất kể kích thước hoặc số thứ nguyên. Vì vậy, khai báo kích thước mảng hoặc số thứ nguyên trong CREATE TABLE chỉ đơn giản là tài liệu; nó không ảnh hưởng đến hành vi thời gian chạy.

Một n -mảng số nguyên thứ nguyên hiệu quả là một mảng n-1 -mảng thứ nguyên của số nguyên trong PostgreSQL. Bạn không thể biết điều đó từ loại chỉ xác định phần tử cơ sở . Bạn phải hỏi array_dims() để biết chi tiết cụ thể.

Để chứng minh:

SELECT array_agg_mult(arr1)               AS arr1  --> 1-dim array
     , array_agg_mult(ARRAY[arr1])        AS arr2  --> 2-dim array
     , array_agg_mult(ARRAY[ARRAY[arr1]]) AS arr3  --> 3-dim array
       -- etc.
FROM  (
   VALUES
      ('{1,2,3}'::int[])                           -- 1-dim array
    , ('{4,5,6}')
    , ('{7,8,9}')
   ) t(arr1);

Hoặc:

SELECT array_agg_mult(arr2)        AS arr2  --> 2-dim array
     , array_agg_mult(ARRAY[arr2]) AS arr3  --> 3-dim array
     , array_agg(arr2)             AS arr3  --> 3-dim array; superior in Postgres 9.5+
FROM  (
   VALUES
      ('{{1,2,3}}'::int[])                  -- 2-dim array
     ,('{{4,5,6}}')
     ,('{{7,8,9}}')
   ) t(arr2);

Tất cả các cột kết quả có cùng một loại :int[] (mặc dù có chứa một số thứ nguyên khác nhau).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo người dùng trong PostgreSQL

  2. Cài đặt đối chiếu utf8 trong PostgreSQL

  3. truy vấn sql nhóm các mục khác nhau thành các nhóm

  4. Các tính năng tương thích Oracle mới trong PostgresPlus Advanced Server 9.3Beta

  5. Trường mô hình duy nhất trong Django và phân biệt chữ hoa chữ thường (postgres)