【MySQL】名前列の最後のスペースより左側の文字列をすべて抽出する方法
名前データが格納された列から、フルネームのうち「最後のスペースより左側」の部分だけを取り出したい場面はよくあります。例えば、姓名が混在するデータから名(ファーストネーム)部分を抽出するようなケースです。MySQLでは LEFT()、LENGTH()、LOCATE()、REVERSE() の各関数を組み合わせることで、この処理を簡単に実現できます。
1. サンプルテーブルの作成
まず、名前を格納するテーブルを作成します。
mysql> create table DemoTable1939 ( FullName varchar(20) ); Query OK, 0 rows affected (0.00 sec)
2. レコードの挿入
INSERT文を使って、いくつかの名前レコードを登録します。カンマを含む名前(Robert Downey, Jr. など)も含めておくことで、動作確認がしやすくなります。
mysql> insert into DemoTable1939 values('Adam Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1939 values('Robert Downey, Jr.');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1939 values('Sylvester Stallone');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1939 values('Chris Hemsworth');
Query OK, 1 row affected (0.00 sec)
3. テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1939;
実行結果は以下のとおりです。
+--------------------+ | FullName | +--------------------+ | Adam Smith | | Robert Downey, Jr. | | Sylvester Stallone | | Chris Hemsworth | +--------------------+ 4 rows in set (0.00 sec)
4. 最後のスペースより左側を抽出するクエリ
ここが本題です。次のクエリを実行すると、各レコードの最後のスペースより左側の文字列をすべて取得できます。
mysql> select
LEFT(FullName, LENGTH(FullName) - LOCATE(' ', REVERSE(FullName))+1)
from DemoTable1939;
実行結果:
+---------------------------------------------------------------------+
| LEFT(FullName, LENGTH(FullName) - LOCATE(' ', REVERSE(FullName))+1) |
+---------------------------------------------------------------------+
| Adam |
| Robert Downey, |
| Sylvester |
| Chris |
+---------------------------------------------------------------------+
4 rows in set (0.00 sec)
5. クエリの仕組みを解説
このクエリがどのように動作しているのか、順を追って見ていきましょう。
① REVERSE(FullName)
文字列を逆順に並び替えます。「Adam Smith」なら「htimS madA」となります。
② LOCATE(' ', REVERSE(FullName))
逆順にした文字列の中で、最初に現れるスペースの位置を取得します。これは元の文字列における「最後のスペース」の位置に相当します。
③ LENGTH(FullName) − LOCATE(...) + 1
全体の文字数から最後のスペースまでの距離を引き算することで、先頭から最後のスペースまでの文字数を求めます。+1 することでスペース自体も結果に含めています(スペースを除外したい場合は +1 を外してください)。
④ LEFT(文字列, 文字数)
算出した文字数分だけ、文字列の左側から切り出して返します。
6. 補足:SUBSTRING_INDEXを使った別解
同じ結果は、SUBSTRING_INDEX() を使ってもっとシンプルに得ることもできます。
mysql> SELECT SUBSTRING_INDEX(FullName, ' ', -1) AS LastName, SUBSTRING_INDEX(FullName, ' ', 1) AS FirstName FROM DemoTable1939;
SUBSTRING_INDEXの第3引数に負の値を指定すると「右側から数えてN個目の区切り文字以降」を取得でき、正の値なら「左側からN個目まで」を取得できます。目的に応じて使い分けるとよいでしょう。
まとめ
MySQLで最後のスペースより左側の文字列を抽出するには、LEFT()・LENGTH()・LOCATE()・REVERSE() を組み合わせる方法が定番です。氏名の分割やデータクレンジングなど、実務でも活用できるテクニックなので、ぜひ覚えておきましょう。
-
MySQLで特定の月と年のレコードを抽出するSELECTクエリの書き方
MySQLで特定の月と年のレコードを取得する方法 MySQLで日付データから特定の月のレコードを抽出するには MONTH() 関数を、特定の年のレコードを抽出するには YEAR() 関数を使用します。これらの関数を WHERE 句で組み合わせることで、「2019年9月」のような具体的な条件でデータを絞り込むことができます。 実際にサンプルテーブルを作成して、動作を確認していきましょう。 1. サンプルテーブルの作成 まず、学生名と入学日を格納するテーブルを作成します。 mysql> create table DemoTable ( StudentName varchar(40)
-
MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法
MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;