SQLでの正規表現による検索方法について、基本的な使い方と具体例をわかりやすく解説します。
正規表現検索とは?

正規表現検索は、文字列のパターンをより柔軟に指定して検索できる機能です。通常のLIKE演算子よりも複雑な条件での検索が可能になります。
正規表現のメリット
- 複雑な文字列パターンを一度に検索できる
- 電話番号やメールアドレスなどの形式チェックができる
- 文字の種類や数を細かく指定できる
どんな時に使う?
- メールアドレスの形式を確認したい時
- 電話番号のパターンを探したい時
- 特定の文字列の組み合わせを見つけたい時
データベース別の正規表現検索構文

PostgreSQLでの使い方
PostgreSQLでは~演算子を使用します。
-- 基本的な構文
SELECT * FROM table_name
WHERE column_name ~ '正規表現パターン';
PostgreSQLの演算子の種類
~:正規表現マッチ(大文字小文字区別あり)~*:正規表現マッチ(大文字小文字区別なし)!~:正規表現に一致しない!~*:正規表現に一致しない(大文字小文字区別なし)
具体例
-- 数字のみを含む文字列を検索
SELECT * FROM products
WHERE product_code ~ '^[0-9]+$';
-- 「A」で始まる文字列を検索(大文字小文字区別なし)
SELECT * FROM users
WHERE name ~* '^a';
MySQLでの使い方(8.0以降)
MySQLではREGEXPまたはRLIKEを使用します。
-- 基本的な構文
SELECT * FROM table_name
WHERE column_name REGEXP '正規表現パターン';
MySQLの特徴
- デフォルトで大文字小文字を区別しない
REGEXPとRLIKEは同じ機能- MySQL 8.0以降で正規表現機能が大幅に強化
具体例
-- 数字3桁の文字列を検索
SELECT * FROM orders
WHERE order_id REGEXP '^[0-9]{3}$';
-- 特定のドメインのメールアドレスを検索
SELECT * FROM customers
WHERE email REGEXP '@gmail\.com$';
Oracleでの使い方
OracleではREGEXP_LIKE関数を使用します。
-- 基本的な構文
SELECT * FROM table_name
WHERE REGEXP_LIKE(column_name, '正規表現パターン');
Oracleの特徴
- 関数形式で使用
- オプションで大文字小文字の区別を指定可能
- 他にも
REGEXP_REPLACE、REGEXP_SUBSTRなどの関数が利用可能
具体例
-- 日本の郵便番号形式を検索
SELECT * FROM addresses
WHERE REGEXP_LIKE(postal_code, '^[0-9]{3}-[0-9]{4}$');
-- 大文字小文字を区別せずに検索
SELECT * FROM products
WHERE REGEXP_LIKE(product_name, '^apple', 'i');
よく使う正規表現パターンの例

メールアドレス形式の検索
-- PostgreSQL
SELECT * FROM users
WHERE email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
-- MySQL
SELECT * FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
-- Oracle
SELECT * FROM users
WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
電話番号形式の検索
-- 日本の携帯電話番号(090-1234-5678形式)
-- PostgreSQL
SELECT * FROM contacts
WHERE phone ~ '^0[789]0-[0-9]{4}-[0-9]{4}$';
-- MySQL
SELECT * FROM contacts
WHERE phone REGEXP '^0[789]0-[0-9]{4}-[0-9]{4}$';
英数字のみの文字列検索
-- PostgreSQL(大文字小文字区別なし)
SELECT * FROM products
WHERE product_code ~* '^[a-z0-9]+$';
-- MySQL
SELECT * FROM products
WHERE product_code REGEXP '^[a-zA-Z0-9]+$';
パフォーマンスに関する注意点

正規表現検索の注意点
- インデックスが効きにくい場合がある
- 複雑なパターンは処理が重くなる
- 大量のデータに対しては実行時間が長くなる可能性
パフォーマンス改善のコツ
- 可能な限り
LIKE演算子で事前に絞り込む - 正規表現の前に固定文字列がある場合は活用する
- 必要に応じて関数インデックスを作成する
-- 悪い例:最初から正規表現で検索
SELECT * FROM users
WHERE email ~ '^[A-Za-z0-9._%+-]+@gmail\.com$';
-- 良い例:LIKEで絞り込んでから正規表現
SELECT * FROM users
WHERE email LIKE '%@gmail.com'
AND email ~ '^[A-Za-z0-9._%+-]+@gmail\.com$';
まとめ
| DBMS | 正規表現構文 | 大文字小文字の扱い | 備考 |
|---|---|---|---|
| PostgreSQL | column ~ 'pattern' | デフォルトで区別あり | ~*で区別なしも可能 |
| MySQL | column REGEXP 'pattern' | デフォルトで区別なし | RLIKEも同じ機能 |
| Oracle | REGEXP_LIKE(column, 'pattern') | オプションで指定可能 | 関数形式、他の関数も豊富 |


コメント