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

Cách sử dụng array_agg () cho varchar []

Hàm tổng hợp chuẩn array_agg() chỉ hoạt động với các loại cơ sở, không phải loại mảng làm đầu vào. (Nhưng Postgres 9.5+ có một biến thể mới của array_agg() điều đó có thể!)

Bạn có thể sử dụng hàm tổng hợp tùy chỉnh array_agg_mult() như được định nghĩa trong câu trả lời có liên quan này:
Chọn dữ liệu vào một mảng Postgres

Tạo nó một lần cho mỗi cơ sở dữ liệu. Sau đó, truy vấn của bạn có thể hoạt động như sau:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM   base.sched_entry se
LEFT   JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE  se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP  BY user_sched_id;

Có một lý do chi tiết trong câu trả lời được liên kết.

Mức độ phải phù hợp

Để trả lời nhận xét của bạn, hãy xem xét trích dẫn này từ sách hướng dẫn về các loại mảng:

Mảng nhiều chiều phải có các phạm vi phù hợp cho từng thứ nguyên. Sự không khớp sẽ gây ra lỗi.

Không có cách nào để giải quyết vấn đề đó, kiểu mảng không cho phép sự không khớp như vậy trong Postgres. Bạn có thể đệm các mảng của bạn bằng các giá trị NULL để tất cả các kích thước đều có phạm vi phù hợp.

Nhưng tôi muốn dịch các mảng thành danh sách được phân tách bằng dấu phẩy với array_to_string() cho mục đích của truy vấn này và sử dụng string_agg() để tổng hợp text - tốt nhất là với một dải phân cách khác. Sử dụng một dòng mới trong ví dụ của tôi:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM   ...

Chuẩn hóa

Bạn có thể muốn xem xét việc chuẩn hóa giản đồ của mình để bắt đầu. Thông thường, bạn sẽ triển khai mối quan hệ n:m như vậy với một bảng riêng biệt như được nêu trong ví dụ này:
Làm thế nào để triển khai mối quan hệ nhiều-nhiều trong PostgreSQL?




  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ông cụ GUI cho PostgreSQL

  2. Loại bỏ bộ não phân tách PostgreSQL trong cơ sở dữ liệu đa đám mây

  3. Làm thế nào để khai báo các biến cục bộ trong postgresql?

  4. Trình kích hoạt sự kiện ROLLBACK trong postgresql

  5. Cách theo dõi Hiệu suất PostgreSQL 12 với OmniDB - Phần 1