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

MySQLのvarcharカラムから数値以外の値を抽出する方法|REGEXPの使い方を徹底解説

MySQLでvarchar型のカラムに格納されたデータの中から、数値以外の値(英字を含むレコード)だけを取り出したいケースは意外と多くあります。そんなときに便利なのがREGEXP演算子です。正規表現パターン「[a-zA-Z]」を組み合わせることで、アルファベットを1文字でも含む行のみを簡単に抽出できます。

基本構文

数値以外の値を選択するための基本的な構文は以下のとおりです。

SELECT *FROM yourTableName WHERE yourColumnName REGEXP '[a-zA-Z]';

このクエリは、指定したカラム内に英字(a〜z、A〜Z)が1文字以上含まれるすべての行を返します。逆に言えば、数字だけで構成されたレコードは自動的に除外される仕組みです。

実際に試してみよう

ここからは、具体的なサンプルを使って動作を確認していきましょう。

ステップ1:サンプルテーブルを作成する

まず、検証用のテーブルを作成します。以下のクエリを実行してください。

mysql> create table SelectNonNumericValue
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserId varchar(100)
    -> );
Query OK, 0 rows affected (0.58 sec)

「Id」カラムが自動採番の主キー、「UserId」カラムがvarchar(100)型というシンプルな構成のテーブルが完成しました。

ステップ2:テストデータを挿入する

次に、INSERT文を使って「数値のみのレコード」と「英字を含むレコード」を混在させて登録します。

mysql> insert into SelectNonNumericValue(UserId) values('123John');
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelectNonNumericValue(UserId) values('58475Carol98457Taylor24');
Query OK, 1 row affected (0.52 sec)
mysql> insert into SelectNonNumericValue(UserId) values('199575Sam124');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SelectNonNumericValue(UserId) values('Mike2456');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SelectNonNumericValue(UserId) values('1000');
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelectNonNumericValue(UserId) values('1001');
Query OK, 1 row affected (0.21 sec)
mysql> insert into SelectNonNumericValue(UserId) values('10293Bob');
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonNumericValue(UserId) values('David');
Query OK, 1 row affected (0.30 sec)
mysql> insert into SelectNonNumericValue(UserId) values('2456');
Query OK, 1 row affected (0.15 sec)

ステップ3:登録内容を確認する

SELECT文ですべてのレコードを表示して、現状を把握しておきましょう。

mysql> select *from SelectNonNumericValue;

実行結果は以下のとおりです。全部で9件のレコードが登録されています。

+----+-------------------------+
| Id | UserId                  |
+----+-------------------------+
| 1  | 123John                 |
| 2  | 58475Carol98457Taylor24 |
| 3  | 199575Sam124            |
| 4  | Mike2456                |
| 5  | 1000                    |
| 6  | 1001                    |
| 7  | 10293Bob                |
| 8  | David                   |
| 9  | 2456                    |
+----+-------------------------+
9 rows in set (0.00 sec)

数値以外の値を抽出するクエリを実行する

いよいよ本題です。WHERE句に「REGEXP '[a-zA-Z]'」を指定して、英字を含むレコードのみを取得してみます。

mysql> select *from SelectNonNumericValue WHERE UserId REGEXP '[a-zA-Z]';

実行結果

以下の出力をご覧ください。「1000」「1001」「2456」といった純粋な数値のみのレコードが除外され、英字を含む6件だけが表示されました。

+----+-------------------------+
| Id | UserId                  |
+----+-------------------------+
| 1  | 123John                 |
| 2  | 58475Carol98457Taylor24 |
| 3  | 199575Sam124            |
| 4  | Mike2456                |
| 7  | 10293Bob                |
| 8  | David                   |
+----+-------------------------+
6 rows in set (0.00 sec)

このように、「123John」のように数字と英字が混在しているレコードも、「David」のように英字のみのレコードも、どちらもしっかり抽出されていることがわかります。ポイントは、カラム全体が数値以外である必要はなく、1文字でも英字が含まれていればマッチするという点です。

応用:逆に数値のみを抽出したい場合

反対に、数字だけで構成されたレコードだけを取り出したい場合は、パターンを「^[0-9]+$」に変更します。

SELECT *FROM yourTableName WHERE yourColumnName REGEXP '^[0-9]+$';

先頭(^)から末尾($)まですべてが0〜9の数字である行だけにマッチするため、純粋な数値レコードのみを厳密に判定できます。用途に応じて正規表現パターンを使い分けてみてください。

  1. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec