MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法
MySQLのCONCAT_WS()関数とは
MySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。
この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。
サンプルテーブルの作成
まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。
mysql> create table demo38
-> (
-> user_id int,
-> user_first_name varchar(20),
-> user_last_name varchar(20),
-> user_date_of_birth date
-> );
Query OK, 0 rows affected (1.70 sec)
テーブルには以下の4つのカラムを定義しています。
- user_id: ユーザーID(整数型)
- user_first_name: 名(varchar型)
- user_last_name: 姓(varchar型)
- user_date_of_birth: 生年月日(date型)
テストデータの挿入
次に、INSERT文を使ってレコードを挿入します。
mysql> insert into demo38 values(10,'John','Smith','1990-10-01');
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo38 values(11,'David','Miller','1994-01-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo38 values(11,'John','Doe','1992-02-01');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo38 values(12,'Adam','Smith','1996-11-11');
Query OK, 1 row affected (0.11 sec)
mysql> insert into demo38 values(13,'Chris','Brown','1997-03-10');
Query OK, 1 row affected (0.13 sec)
登録データの確認
SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from demo38;
実行結果は以下の通りです。
+---------+-----------------+----------------+--------------------+
| user_id | user_first_name | user_last_name | user_date_of_birth |
+---------+-----------------+----------------+--------------------+
| 10 | John | Smith | 1990-10-01 |
| 11 | David | Miller | 1994-01-21 |
| 11 | John | Doe | 1992-02-01 |
| 12 | Adam | Smith | 1996-11-11 |
| 13 | Chris | Brown | 1997-03-10 |
+---------+-----------------+----------------+--------------------+
5 rows in set (0.00 sec)
5件のレコードが正しく登録されていることがわかります。
CONCAT_WS()と条件指定を組み合わせたクエリ
ここからが本題です。CONCAT_WS()関数を使って名前と生年月日の年を連結し、さらにWHERE句でuser_idが11または13の行だけを抽出してみましょう。
mysql> select concat_ws('/',user_first_name, user_last_name,'the date of birth year is=', date_format(user_date_of_birth,'%Y')) as Output
-> from demo38
-> where user_id in(11,13);このクエリのポイントは以下の通りです。
- 第1引数の「'/'」:区切り文字としてスラッシュを指定しています。CONCAT_WS()は第1引数を区切り文字として扱い、以降の引数をその文字で連結します。
- DATE_FORMAT(user_date_of_birth,'%Y'):日付から年のみを取り出すために使用しています。
- WHERE user_id in(11,13):IN演算子により、user_idが11または13の行に絞り込んでいます。
実行結果
上記のクエリを実行すると、次のような出力が得られます。
+----------------------------------------------+
| Output |
+----------------------------------------------+
| David/Miller/the date of birth year is=/1994 |
| John/Doe/the date of birth year is=/1992 |
| Chris/Brown/the date of birth year is=/1997 |
+----------------------------------------------+
3 rows in set (0.00 sec)
user_idが11の2件(David Miller、John Doe)と、user_idが13の1件(Chris Brown)の計3行が抽出され、それぞれ「名前/生年月日の年」の形式で連結された文字列が出力されました。
まとめ
MySQLで条件に一致する行を連結形式で取得したい場合は、CONCAT_WS()関数とWHERE句を組み合わせるのが効果的です。区切り文字は自由に指定でき、DATE_FORMAT()などの関数と併用することで、日付の整形も柔軟に行えます。レポート出力やCSV形式へのエクスポートなど、実務でも幅広く活用できるテクニックなので、ぜひ覚えておきましょう。
-
MySQLでスペースを含むカラム名をSELECT文で取得する方法
MySQLでスペースを含むカラム名を扱うにはMySQLでは、テーブル作成時にスペースを含むカラム名を定義できますが、そのようなカラムをSELECT文で参照する際には注意が必要です。スペースを含むカラム名を指定する場合は、バッククォート(` `)でカラム名を囲む必要があります。バッククォートは、キーボードのチルダ記号(~)の下にあるキーで入力できます。シングルクォート()とは異なる記号なので、混同しないようにしましょう。1. スペースを含むカラムを持つテーブルを作成するまず、「Student Name」というスペースを含むカラム名を持つテーブルを作成します。カラム名はバッククォートで囲みます。m
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected