【MySQL】文字列の最後のカンマ以降を削除する方法|SUBSTRING_INDEXの使い方を実例で解説
はじめに
MySQLで文字列内の最後のカンマ(,)以降の文字をすべて削除したい場合は、SUBSTRING_INDEX()関数を使うのが最も簡単です。カンマの位置があらかじめ分からない場合でも、LENGTH()関数とREPLACE()関数を組み合わせることで、カンマの位置を動的に特定できます。
基本構文
UPDATE yourTableName SET yourColumnName = SUBSTRING_INDEX(yourColumnName, ',', LENGTH(yourColumnName) - LENGTH(REPLACE(yourColumnName, ',', '')));
仕組みのポイント
LENGTH(yourColumnName)… 元の文字列全体の長さを取得します。LENGTH(REPLACE(yourColumnName, ',', ''))… カンマをすべて取り除いた状態の文字列の長さを取得します。- この2つの差が「文字列内に含まれるカンマの個数」となります。
SUBSTRING_INDEX(文字列, ',', n)はn番目のカンマより前の部分文字列を返すため、nにカンマの総数を指定すると「最後のカンマの手前まで」が抽出されます。
実行例:テーブル作成からデータ更新まで
1. サンプルテーブルを作成する
まず、動作確認用のテーブルを作成します。
mysql> create table RemoveAllCharacters
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> FullInfo varchar(200),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.83 sec)2. テストデータを挿入する
INSERT文で複数のレコードを追加します。
mysql> insert into RemoveAllCharacters(FullInfo) values('John,Smith,23,98,4565886');
Query OK, 1 row affected (0.23 sec)
mysql> insert into RemoveAllCharacters(FullInfo) values('Carol,Taylor,26,91');
Query OK, 1 row affected (0.28 sec)
mysql> insert into RemoveAllCharacters(FullInfo) values('David,Miller,21');
Query OK, 1 row affected (0.11 sec)
mysql> insert into RemoveAllCharacters(FullInfo) values('Robert,Jones,22,97');
Query OK, 1 row affected (0.09 sec)
mysql> insert into RemoveAllCharacters(FullInfo)
values('Sam,Williams,27,88,456788,97877');
Query OK, 1 row affected (0.13 sec)3. 更新前のデータを確認する
mysql> select *from RemoveAllCharacters;
実行結果は以下の通りです。
+----+---------------------------------+ | Id | FullInfo | +----+---------------------------------+ | 1 | John,Smith,23,98,4565886 | | 2 | Carol,Taylor,26,91 | | 3 | David,Miller,21 | | 4 | Robert,Jones,22,97 | | 5 | Sam,Williams,27,88,456788,97877 | +----+---------------------------------+ 5 rows in set (0.00 sec)
4. 最後のカンマ以降を削除するUPDATE文を実行する
ここで本題のクエリを実行します。
mysql> update RemoveAllCharacters
-> set FullInfo = SUBSTRING_INDEX(FullInfo, ',', LENGTH(FullInfo) - LENGTH(REPLACE(FullInfo, ',', '')));
Query OK, 5 rows affected (0.28 sec)
Rows matched: 5 Changed: 5 Warnings: 05. 更新後のデータを確認する
mysql> select *from RemoveAllCharacters;
実行結果を見ると、各行の最後のカンマと、その後ろにあった文字(末尾の数値など)がすべて削除されていることが分かります。
+----+---------------------------+ | Id | FullInfo | +----+---------------------------+ | 1 | John,Smith,23,98 | | 2 | Carol,Taylor,26 | | 3 | David,Miller | | 4 | Robert,Jones,22 | | 5 | Sam,Williams,27,88,456788 | +----+---------------------------+ 5 rows in set (0.00 sec)
まとめ
文字列の最後のカンマ以降を削除するには、次の関数の組み合わせが有効です。
SUBSTRING_INDEX():区切り文字より前の部分を抽出するLENGTH()とREPLACE():カンマの個数を動的に算出する
この手法は、カンマ区切りのデータから末尾の項目を取り除きたい場合などに幅広く応用できます。なお、逆に「最後のカンマ以降の文字だけを取得したい」場合は、SUBSTRING_INDEX(列名, ',', -1) のように負の値を指定すればOKです。
-
MySQLでVARCHAR文字列からハイフン以降の数値を削除する方法(SUBSTRING_INDEX活用)
MySQLで「John-232」のようなハイフンを含むVARCHAR型の文字列から、ハイフン以降の数値部分を削除したい場合があります。このような処理には、SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。SUBSTRING_INDEX()関数とはSUBSTRING_INDEX(文字列, 区切り文字, 出現回数) は、指定した区切り文字が現れる位置より前の部分文字列を返す関数です。第3引数に「1」を指定すると、区切り文字が最初に出現する位置より前の文字列だけが取得されます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create t
-
Javaで文字列からアルファベット以外の文字をすべて削除する方法
Javaのsplit()メソッドは、区切り文字を表す文字列を引数として受け取り、その区切り文字をもとに文字列をトークン(単語)の配列へと分割します。2つの区切り文字の間にある部分が1つのトークンとして扱われます。例えば、半角スペース「 」を区切り文字としてこのメソッドに渡すと、スペースとスペースの間にある単語を1つのトークンとみなし、元の文字列に含まれる単語の配列を返します。なお、指定した区切り文字が文字列中に存在しない場合は、文字列全体を1つの要素とする配列が返されます。また、正規表現「\\W+」は、文字列内のすべてのアルファベット以外の文字(句読点、スペース、アンダースコア、特殊記号など)