PostgreSQL 9.0 atau yang lebih baru:
Postgres modern (sejak 2010) memiliki string_agg(expression, delimiter)
fungsi yang akan melakukan persis seperti yang dicari penanya:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Postgres 9 juga menambahkan kemampuan untuk menentukan ORDER BY
klausa dalam ekspresi agregat apa pun; jika tidak, Anda harus memesan semua hasil Anda atau menangani pesanan yang tidak ditentukan. Jadi sekarang Anda dapat menulis:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4 (tahun 2009) memperkenalkan fungsi agregat array_agg(expression)
yang mengumpulkan nilai-nilai dalam array. Kemudian array_to_string()
dapat digunakan untuk memberikan hasil yang diinginkan:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x dan yang lebih lama:
Ketika pertanyaan ini awalnya diajukan, tidak ada fungsi agregat bawaan untuk menggabungkan string. Implementasi kustom paling sederhana (disarankan oleh Vajda Gabo di pos milis ini, di antara banyak lainnya) adalah dengan menggunakan textcat
bawaan fungsi (yang terletak di belakang ||
operator):
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
Berikut adalah CREATE AGGREGATE
dokumentasi.
Ini hanya merekatkan semua senar bersama-sama, tanpa pemisah. Untuk mendapatkan "," yang disisipkan di antara mereka tanpa memilikinya di akhir, Anda mungkin ingin membuat fungsi gabungan Anda sendiri dan menggantinya dengan "textcat" di atas. Ini yang saya kumpulkan dan uji pada 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;
Versi ini akan menampilkan koma meskipun nilai pada baris tersebut null atau kosong, sehingga Anda mendapatkan output seperti ini:
a, b, c, , e, , g
Jika Anda lebih suka menghapus koma tambahan untuk menampilkan ini:
a, b, c, e, g
Kemudian tambahkan ELSIF
periksa ke fungsinya seperti ini:
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;