MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで条件に応じて同じ列の2つの値を連結する方法

MySQLで条件に応じて同じ列の2つの値を連結する方法

MySQLでは、max() などの集計関数と CASE 式を組み合わせることで、条件の異なる同じ列の値を1つの文字列として連結できます。この記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。

1. サンプルテーブルの作成

まず、create table コマンドでテーブルを作成しましょう。

mysql> create table DemoTable1869
    (
    Id int,
    Subject varchar(20),
    Name varchar(20)
    );
Query OK, 0 rows affected (0.00 sec)

2. レコードの挿入

続いて、insert コマンドを使ってテーブルにレコードを追加します。

mysql> insert into DemoTable1869 values(100,'MySQL','John');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1869 values(100,'MongoDB','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1869 values(101,'MySQL','Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1869 values(101,'MongoDB','Brown');
Query OK, 1 row affected (0.00 sec)

3. テーブルの内容を確認

select 文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1869;

実行結果は以下の通りです。

+------+---------+-------+
| Id   | Subject | Name  |
+------+---------+-------+
|  100 | MySQL   |  John |
|  100 | MongoDB | Smith |
|  101 | MySQL   | Chris |
|  101 | MongoDB | Brown |
+------+---------+-------+
4 rows in set (0.00 sec)

4. 条件の異なる同じ列の値を連結するクエリ

ここからが本題です。Id ごとに「MySQL」の名前と「MongoDB」の名前をそれぞれ取り出し、それらを連結するには、以下のようなクエリを使用します。

mysql> select Id,concat(StudentFirstName,'',StudentLastName)
    from
    (
      select Id,
      max(case when Subject='MySQL' then Name end) as StudentFirstName,
      max(case when Subject='MongoDB' then Name end) as StudentLastName
      from DemoTable1869
      group by Id
    )tbl;

5. 実行結果

クエリを実行すると、次のような出力が得られます。

+------+---------------------------------------------+
| Id   | concat(StudentFirstName,'',StudentLastName) |
+------+---------------------------------------------+
|  100 | JohnSmith                                    |
|  101 | ChrisBrown                                   |
+------+---------------------------------------------+
2 rows in set (0.00 sec)

クエリのポイント

このクエリが機能する仕組みを整理しておきましょう。

  • ピボット処理:サブクエリ内で GROUP BY Id によりデータをId単位でグループ化し、CASE 式で Subject の値に応じて Name を縦持ちから横持ち(列)へ展開しています。
  • max() の役割max() は NULL を無視して最大値を返すため、条件に合致しない行の NULL を排除し、目的の名前だけを確実に取得できます。
  • concat() による連結:外側のクエリで concat() を使うことで、2つの名前を1つの文字列として連結しています。

なお、名前の間に区切り文字を入れたい場合は、concat(StudentFirstName,' ',StudentLastName) のように第2引数を変更するだけで簡単に対応できます。

  1. MySQLで列の値と任意のテキストを連結して1つの列に表示する方法

    MySQLで列の値とテキストを連結する方法MySQLでは、CONCAT()関数を使用することで、テーブルの列の値と任意のテキストを連結し、結果を1つの列として表示できます。本記事では、サンプルテーブルを作成し、実際に文字列を連結して表示するまでの手順を具体例とともに解説します。1. テーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query OK, 0 rows affected (0.93 sec)こ

  2. MySQLのCASE文を使ってAmount列から条件別に2種類の合計値を同時に取得する方法

    MySQLでは、CASE文を活用することで、1つのクエリ内で異なる条件ごとの合計値を複数同時に算出できます。例えば、Amount(金額)列から「全体の合計」と「特定条件を満たすレコードのみの合計」を一度に表示したい場合に非常に便利です。ここでは、具体的な手順をサンプルとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1794 ( Amount int ); Query OK, 0 rows affected (0.00 sec)2. テストデータの挿入INSERTコマンドを使って、