sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLの「groupby」クエリで文字列フィールドの文字列を連結するにはどうすればよいですか?

    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;
    


    1. MySQLエラー1436:単純なクエリでスレッドスタックがオーバーランしました

    2. pgAdminでユーザーを作成する方法

    3. Oracle.DataAccess.dllは存在しますが見つかりません

    4. 一般的なSQLiteの問題を解決するのに役立つ方法はありますか?