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') | オプションで指定可能 | 関数形式、他の関数も豊富 |
コメント