PostgreSQL 9.0以降:
最新のPostgres(2010年以降)にはstring_agg(expression, delimiter)
があります 質問者が探していたものを正確に実行する関数:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Postgres 9には、ORDER BY
を指定する機能も追加されました。 任意の集計式の句。それ以外の場合は、すべての結果を注文するか、未定義の注文を処理する必要があります。これで、次のように書くことができます:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4(2009年)では、集計関数array_agg(expression)
が導入されました。 配列に値を収集します。次に、array_to_string()
目的の結果を出すために使用できます:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x以前:
この質問が最初に提起されたとき、文字列を連結するための組み込みの集計関数はありませんでした。最も単純なカスタム実装(特に、このメーリングリストの投稿でVajda Gaboによって提案されています)は、組み込みのtextcat
を使用することです。 関数(||
の背後にあります 演算子):
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
これがCREATE AGGREGATE
です。 ドキュメント。
これは、セパレータなしで、すべてのストリングを単に接着します。最後に「、」を挿入せずにそれらの間に挿入するには、独自の連結関数を作成して、上記の「textcat」の代わりに使用することをお勧めします。これが私がまとめて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;
このバージョンでは、行の値がnullまたは空の場合でもコンマが出力されるため、次のような出力が得られます。
a, b, c, , e, , g
これを出力するために余分なコンマを削除したい場合:
a, b, c, e, g
次に、ELSIF
を追加します 次のような機能を確認してください:
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;