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

Chúng ta có thể định nghĩa một hàm GROUP_CONCAT trong PostgreSQL không?

Có một nội trang string_agg () thực hiện những gì bạn muốn, nhưng bạn đặc biệt yêu cầu nó được đặt tên là group_concat để tương thích với MySQL. Thật không may, string_agg () sử dụng kiểu dữ liệu nội bộ để tích lũy (có lẽ để tránh sao chép toàn bộ bộ đệm trên mỗi phần phụ, tôi chưa xem xét nguồn) và tôi không tìm thấy cách khai báo tổng hợp SQL giống hệt với string_agg ( ).

Việc xác định hàm group_concat () cũng sẽ không hoạt động, vì pg phải lưu ý rằng nó là một tổng hợp, không phải một hàm có tổng hợp ẩn bên trong, sẽ không hoạt động. Một hàm như vậy sẽ hoạt động trên một hàng tại một thời điểm:bất kỳ tổng hợp nào bên trong sẽ chỉ tổng hợp một hàng duy nhất và trả về nó không thay đổi ...

Do đó, đoạn mã này sẽ tích lũy các phần tử thành một mảng, sau đó thêm dấu phân cách "," với chuỗi_mảng. Tôi sẽ sử dụng khai báo array_agg () (trước khi nó được tích hợp sẵn) làm mô hình và chỉ cần thêm một hàm hoàn thiện sẽ chuyển đổi mảng tổng hợp thành văn bản.

CREATE OR REPLACE FUNCTION _group_concat_finalize(anyarray)
RETURNS text AS $$
    SELECT array_to_string($1,',')
$$ IMMUTABLE LANGUAGE SQL;

CREATE AGGREGATE group_concat(anyelement) (
   SFUNC=array_append,
   STYPE=anyarray,
   FFUNC=_group_concat_finalize,
   INITCOND='{}'
);

SELECT group_concat(x) FROM foo;

Điều tốt đẹp là nó sẽ hoạt động tốt với mọi loại mà không gặp rắc rối, nhờ vào các loại chung "anyarray" và "anyelement".

Tôi cho rằng điều này sẽ chậm hơn string_agg () nếu string_agg thực sự tránh sao chép toàn bộ mảng tổng hợp trên mỗi phần phụ. Tuy nhiên, điều này chỉ quan trọng nếu số lượng hàng được nhóm vào mỗi tập hợp là lớn. Trong trường hợp này, bạn có thể dành một phút để chỉnh sửa truy vấn SQL;)

http://sqlfiddle.com/#!17/c452d/1



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm thuộc tính vào đối tượng được trả về bởi Sequelize FindOne

  2. UnknownHostException khi cố gắng kết nối với heroku-postgres từ dự án Springboot cục bộ với Spring JPA

  3. Xác thực cơ sở dữ liệu CAS không hoạt động

  4. Làm cách nào để lọc cột mảng PostgreSQL bằng API tiêu chí JPA?

  5. Thiết lập dữ liệu liên tục cho Carto / Postgresql trên ACI