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の数字である行だけにマッチするため、純粋な数値レコードのみを厳密に判定できます。用途に応じて正規表現パターンを使い分けてみてください。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec