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

【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() を組み合わせる方法が定番です。氏名の分割やデータクレンジングなど、実務でも活用できるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLで特定の月と年のレコードを抽出するSELECTクエリの書き方

    MySQLで特定の月と年のレコードを取得する方法 MySQLで日付データから特定の月のレコードを抽出するには MONTH() 関数を、特定の年のレコードを抽出するには YEAR() 関数を使用します。これらの関数を WHERE 句で組み合わせることで、「2019年9月」のような具体的な条件でデータを絞り込むことができます。 実際にサンプルテーブルを作成して、動作を確認していきましょう。 1. サンプルテーブルの作成 まず、学生名と入学日を格納するテーブルを作成します。 mysql> create table DemoTable ( StudentName varchar(40)

  2. MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法

    MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;