質問

いなければならないというニーズを連結の文字列のフィールドのグループによるモードです。ですから例えば、テーブル:

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

やりたかったグループによるcompany_idかのようなもの:

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

ありが可能で使いこ group_concat

役に立ちましたか?

解決

PostgreSQL9.0以降:

最近のバージョンのPostgres(2010年)に string_agg(expression, delimiter) 機能などの問題もきフィールド区切り文字を指定する文字列:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

Postgres9.0も追加する機能を指定 ORDER BY任意の集合表現;その他については、定義されていません。ることができるようになった書き:

SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;

時には:

SELECT string_agg(actor_name, ', ' ORDER BY first_appearance)

PostgreSQL8.4以降:

PostgreSQL8.4(2009年)の導入 の総数 array_agg(expression) るconcatenatesの値を、配列になります。その array_to_string() 使用でき、所望の結果:

SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;

string_agg 前バージョン9.0:

場合には誰がこのを探してcompatibiltyシム前9.0データベースを行うことが可能であ string_agg を除く ORDER BY を提供しています。

では、以下に定義すべき作業と同様に9.x Postgres DB:

SELECT string_agg(name, '; ') AS semi_colon_separated_names FROM things;

この構文エラー:

SELECT string_agg(name, '; ' ORDER BY name) AS semi_colon_separated_names FROM things;
--> ERROR: syntax error at or near "ORDER"

テPostgreSQL8.3.

CREATE FUNCTION string_agg_transfn(text, text, text)
    RETURNS text AS 
    $$
        BEGIN
            IF $1 IS NULL THEN
                RETURN $2;
            ELSE
                RETURN $1 || $3 || $2;
            END IF;
        END;
    $$
    LANGUAGE plpgsql IMMUTABLE
COST 1;

CREATE AGGREGATE string_agg(text, text) (
    SFUNC=string_agg_transfn,
    STYPE=text
);

カスタム変化(すべてのPostgresバージョン)

前9.0たが、内蔵の集計関数を連結の文字列です。最も簡単なカスタム実施ことを示唆するVajda Rebelこのメーリングリストのポスト, 時間は内蔵 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;

他のヒント

の使用に関してはどうPostgres内蔵配列)少なくとも8.4この作品のボックス

SELECT company_id, array_to_string(array_agg(employee), ',')
FROM mytable
GROUP BY company_id;

としてからPostgreSQL9.0で利用できますの総数 string_agg.新しいSQLはこのようになります:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

受信用の回答がなかなか検索:

何を知らなかったのはPostgreSQLで自動的に集計機能 を集計

このポスト のPostgreSQLのリストを示してどのようなものを作る機能などが必要です:

CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);

SELECT company_id, textcat_all(employee || ', ')
FROM mytable
GROUP BY company_id;

既述のように、自分で集計機能が正しいことだと思います。ここでは私を連結した集計関数(すべ 詳細はフランス語):

CREATE OR REPLACE FUNCTION concat2(text, text) RETURNS text AS '
    SELECT CASE WHEN $1 IS NULL OR $1 = \'\' THEN $2
            WHEN $2 IS NULL OR $2 = \'\' THEN $1
            ELSE $1 || \' / \' || $2
            END; 
'
 LANGUAGE SQL;

CREATE AGGREGATE concatenate (
  sfunc = concat2,
  basetype = text,
  stype = text,
  initcond = ''

);

そしてとして利用す:

SELECT company_id, concatenate(employee) AS employees FROM ...

今回の発表リストのスニペットがなされますへのアップグレード8.4:

ま8.4が出 スーパー-effientネイティブワーに追加することができます のarray_accum()関数の PostgreSQLのドキュメントを巻く 最大のカラム配列には、 して使用しているアプリケーションコード、または 合array_to_string()を 形式としてリスト:

http://www.postgresql.org/docs/current/static/xaggr.html

私へのリンク8.4開発docsもいなかったのでしょうか一覧この機能はまだない。

フォローアップしKevの答えを使用し、Postgres docs:

まずは、配列の要素を使用し、内蔵 array_to_string 機能です。

CREATE AGGREGATE array_accum (anyelement)
(
 sfunc = array_append,
 stype = anyarray,
 initcond = '{}'
);

select array_to_string(array_accum(name),'|') from table group by id;

以下のものを使用カスタム集計関数の文字列の連結:必要なものは覚えているのですが、selectステー場行は、任意の順序が必要となりますのでいサブ 選択から 決算例 注文 条項、そして外 選択グループ 項の数は文字列の場合、次のようになります

SELECT custom_aggregate(MY.special_strings)
FROM (SELECT special_strings, grouping_column 
        FROM a_table 
        ORDER BY ordering_column) MY
GROUP BY MY.grouping_column

このPostgreSQLのドキュメントのホ: http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html.

私の場合、求める平野SQLを連結フィールドブラケットそのままのフィールドが空白でない.

select itemid, 
  CASE 
    itemdescription WHEN '' THEN itemname 
    ELSE itemname || ' (' || itemdescription || ')' 
  END 
from items;

使用 STRING_AGG 機能 PostgreSQLGoogle BigQuery SQL:

SELECT company_id, STRING_AGG(employee, ', ')
FROM employees
GROUP BY company_id;

によるバージョンのPostgreSQL9.0以上で利用できますの総数string_agg.新しいSQLはこのようになります:

SELECT company_id, string_agg(employee, ', ')
    FROM mytable GROUP BY company_id;

も利用できる形式の機能です。でも暗黙のうちに配慮型の変換テキスト、intなどによりそのものです。

create or replace function concat_return_row_count(tbl_name text, column_name text, value int)
returns integer as $row_count$
declare
total integer;
begin
    EXECUTE format('select count(*) from %s WHERE %s = %s', tbl_name, column_name, value) INTO total;
    return total;
end;
$row_count$ language plpgsql;


postgres=# select concat_return_row_count('tbl_name','column_name',2); --2 is the value

を使用していJetbrains仮面ライダーで手間を複写の結果から上記の例の再実行が包まで全てのJSON.この入して決定した較

select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$

まAmazon Redshiftがstring_aggはサポートされていません使ってみlistagg.

SELECT company_id, listagg(EMPLOYEE, ', ') as employees
FROM EMPLOYEE_table
GROUP BY company_id;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top