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;