どのように連結の文字列の文字列分野のPostgreSQLグループによるク?
-
09-06-2019 - |
質問
いなければならないというニーズを連結の文字列のフィールドのグループによるモードです。ですから例えば、テーブル:
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 = ''
);
では、このメソッドは単純接着剤のすべての文字列と、セパレーターが不要になる。を得るために","を挿入しないで終了するために自分の連結機能および代替のために"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;
既述のように、自分で集計機能が正しいことだと思います。ここでは私を連結した集計関数(すべ 詳細はフランス語):
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()を 形式としてリスト:
私へのリンク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
機能 PostgreSQL や Google 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;