メインコンテンツまでスキップ

group_concat

group_concat

説明

非NULLの値をグループごとに1つの文字列に連結します。sep引数を指定することもできますが、指定されていない場合はデフォルトで,(カンマ)が使用されます。この関数は、複数の行の列の値を1つの文字列に連結するために使用できます。

group_concatは、3.0.6以降の3.0バージョンと3.1.3以降の3.1バージョンで、DISTINCTおよびORDER BYをサポートしています。

構文

VARCHAR GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR sep])

パラメータ

  • expr:連結する値で、NULL値は無視されます。VARCHARに評価する必要があります。出力文字列から重複する値を除外するには、オプションでDISTINCTを指定できます。複数のexprを直接連結する場合は、concatまたはconcat_wsを使用してフォーマットを指定します。
  • ORDER BYの項目は、非負の整数(1から始まる)、列名、または一般的な式にすることができます。結果はデフォルトで昇順でソートされます。ソート結果を降順にしたい場合は、ソートしている列の名前にDESCキーワードを追加します。
  • sep:異なる行の非NULL値を連結するために使用されるオプションのセパレータです。指定されていない場合は、デフォルトで,(カンマ)が使用されます。セパレータを除外するには、空の文字列''を指定します。

戻り値

各グループごとに文字列値を返し、非NULL値がない場合はNULLを返します。

group_concatによって返される文字列の長さは、セッション変数group_concat_max_lenを設定することによって制限することができます。デフォルトは1024です。最小値:4。単位:文字。

例:

SET [GLOBAL | SESSION] group_concat_max_len = <value>;

  1. 科目のスコアを含むテーブルssを作成します。

    CREATE TABLE `ss` (
    `id` int(11) NULL COMMENT "",
    `name` varchar(255) NULL COMMENT "",
    `subject` varchar(255) NULL COMMENT "",
    `score` int(11) NULL COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`id`)
    DISTRIBUTED BY HASH(`id`) BUCKETS 4
    PROPERTIES (
    "replication_num" = "1"
    );

    insert into ss values (1,"Tom","英語",90);
    insert into ss values (1,"Tom","数学",80);
    insert into ss values (2,"Tom","英語",NULL);
    insert into ss values (2,"Tom",NULL,NULL);
    insert into ss values (3,"May",NULL,NULL);
    insert into ss values (3,"Ti","英語",98);
    insert into ss values (4,NULL,NULL,NULL);
    insert into ss values (NULL,"Ti","物理",98);

    select * from ss order by id;
    +------+------+---------+-------+
    | id | name | subject | score |
    +------+------+---------+-------+
    | NULL | Ti | 物理 | 98 |
    | 1 | Tom | 英語 | 90 |
    | 1 | Tom | 数学 | 80 |
    | 2 | Tom | 英語 | NULL |
    | 2 | Tom | NULL | NULL |
    | 3 | May | NULL | NULL |
    | 3 | Ti | 英語 | 98 |
    | 4 | NULL | NULL | NULL |
    +------+------+---------+-------+
  2. group_concatを使用します。

例1:デフォルトのセパレータで名前を連結し、NULL値は無視します。重複する名前は保持されます。

 select group_concat(name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Tom,Tom,Ti,Tom,Tom,May,Ti |
+---------------------------+

例2:デフォルトのセパレータで重複した名前を除外して名前を連結します。

 select group_concat(distinct name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Ti,May,Tom |
+---------------------------+

例3:IDが同じ名前-科目をscoreの昇順で連結します。例えば、TomMathおよびTomEnglishはID 1を共有し、scoreの昇順でカンマで連結されます。

 select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------------------+
| id | res |
+------+--------------------+
| NULL | TiPhy |
| 1 | TomMath,TomEnglish |
| 2 | TomEnglish |
| 3 | TiEnglish |
| 4 | NULL |
+------+--------------------+

例4:group_concatはconcat()とネストされ、name-、およびsubjectを文字列として組み合わせるために使用されます。同じ行の文字列は、scoreの昇順でソートされます。

 select id, group_concat(distinct concat(name,'-',subject) order by score) as res from ss group by id order by id;
+------+----------------------+
| id | res |
+------+----------------------+
| NULL | Ti-Phy |
| 1 | Tom-Math,Tom-English |
| 2 | Tom-English |
| 3 | Ti-English |
| 4 | NULL |
+------+----------------------+

例5:一致する結果が見つからず、NULLが返されます。

select group_concat(distinct name) as res from ss where id < 0;
+------+
| res |
+------+
| NULL |
+------+

例6:返される文字列の長さを6文字に制限します。

 set group_concat_max_len = 6;

select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------+
| id | res |
+------+--------+
| NULL | TiPhy |
| 1 | TomMat |
| 2 | NULL |
| 3 | TiEngl |
| 4 | NULL |
+------+--------+

キーワード

GROUP_CONCAT、CONCAT、ARRAY_AGG