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

Làm cách nào để nối các chuỗi của một trường chuỗi trong một truy vấn PostgreSQL 'group by'?

PostgreSQL 9.0 trở lên:

Postgres hiện đại (từ năm 2010) có string_agg(expression, delimiter) chức năng này sẽ thực hiện chính xác những gì người hỏi đang tìm kiếm:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

Postgres 9 cũng bổ sung khả năng chỉ định ORDER BY mệnh đề trong bất kỳ biểu thức tổng hợp nào; nếu không, bạn phải sắp xếp tất cả các kết quả của mình hoặc đối phó với một đơn đặt hàng không xác định. Vì vậy, bây giờ bạn có thể viết:

SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;

PostgreSQL 8.4.x:

PostgreSQL 8.4 (năm 2009) đã giới thiệu hàm tổng hợp array_agg(expression) thu thập các giá trị trong một mảng. Sau đó, array_to_string() có thể được sử dụng để đưa ra kết quả mong muốn:

SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;

PostgreSQL 8.3.x trở lên:

Khi câu hỏi này ban đầu được đặt ra, không có hàm tổng hợp được tích hợp sẵn để nối các chuỗi. Cách triển khai tùy chỉnh đơn giản nhất (do Vajda Gabo đề xuất trong bài đăng danh sách gửi thư này, trong số nhiều cách khác) là sử dụng textcat tích hợp sẵn hàm (nằm sau || nhà điều hành):

CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);

Đây là CREATE AGGREGATE tài liệu.

Điều này chỉ đơn giản là dán tất cả các chuỗi lại với nhau, không có dấu phân cách. Để có được một "," được chèn vào giữa chúng mà không có nó ở cuối, bạn có thể muốn tạo hàm nối của riêng mình và thay thế nó cho "textcat" ở trên. Đây là một trong những tôi đã tổng hợp lại và thử nghiệm vào 8.3.12:

CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;

Phiên bản này sẽ xuất ra một dấu phẩy ngay cả khi giá trị trong hàng là null hoặc rỗng, vì vậy bạn nhận được kết quả như sau:

a, b, c, , e, , g

Nếu bạn muốn loại bỏ các dấu phẩy thừa để xuất ra kết quả này:

a, b, c, e, g

Sau đó, thêm một ELSIF kiểm tra chức năng như sau:

CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSIF instr IS NULL OR instr = '' THEN
      RETURN acc;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thêm cột nếu không tồn tại trên PostgreSQL?

  2. Cách tách một chuỗi trong PostgreSQL

  3. Chọn hàng ngẫu nhiên cho mỗi nhóm

  4. tính toán phần trăm thứ n trong postgresql

  5. Tại sao tôi có thể tạo một bảng với PRIMARY KEY trên một cột có thể làm trống?