2009-12-22 56 views
10

Tôi đang gặp một kinh nghiệm đau đớn đầu tiên với postgresql, và netbook nhỏ gọn, thách thức của thời điểm này là:Postgresql - concat_ws giống như chức năng?

Làm thế nào để thực hiện một concat_ws trong postgresql, tham gia một số lĩnh vực giá trị từ một nhóm bởi:

select concat_ws(';',field_lambda) from table_lambda group by id; 
+2

FYI, concat_ws sẽ được trong PostgreSQL 9.1 : http://developer.postgresql.org/pgdocs/postgres/functions-string.html –

+0

.. nhưng trong Postgres 'concat_ws()' là * không * một hàm tổng hợp. Sử dụng 'string_agg()' để thay thế. Xem bên dưới. –

Trả lời

14

Đối với PostgreSQL 8.4 trở lên:

select ARRAY_TO_STRING(
    ARRAY_AGG(field_lambda),';' 
) from table_lambda group by id; 
+1

Cảm ơn, điều đó hoạt động. – Gzorg

2

Without array_agg (trước 8.4), bạn có thể sử dụng:

SELECT array_to_string(
    ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';' 
); 
0

Theo PostgreSQL wiki, bạn có thể mô phỏng hàm PostgreSQL 8.4 array_agg để đến gần với những gì bạn cần.

CREATE AGGREGATE array_agg(anyelement) (
    SFUNC=array_append, 
    STYPE=anyarray, 
    INITCOND='{}' 
); 
4

Kể từ PostgreSQL 9.0 (phát hành tháng 9 năm 2010), có chức năng tổng hợp string_agg() để làm những gì bạn dường như muốn:

SELECT string_agg(field1, ';') FROM tbl GROUP BY id; 

Lưu ý, rằng tham số thứ hai là tách (tương tự như các hàm tổng hợp khác).

Ngoài ra còn có các chuỗi chức năng concat_ws() từ PostgreSQL 9.1, điều đó bằng cách khác làm tương tự như MySQL của concat_ws() (khi không bị lạm dụng như chức năng tổng hợp). Nó đặc biệt hữu ích để đối phó với các giá trị NULL.

SELECT concat_ws(';', field1, field2, field3) FROM tbl 

Bạn thậm chí có thể kết hợp cả hai để tăng đột biến nhiều cột theo bất kỳ cách nào bạn muốn.

SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields 
FROM tbl 
GROUP BY id; 
-1

người hơn nữa đến đây cho vấn đề này, phương pháp này sẽ không làm việc với nhiều cột (như concat_ws sẽ) nếu bạn muốn hỗ trợ nhiều colums sử dụng

ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter'). 
Các vấn đề liên quan