SQLで正規表現検索を使う方法|パターンマッチングの強力なツール

データベース・SQL

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の特徴

  • デフォルトで大文字小文字を区別しない
  • REGEXPRLIKEは同じ機能
  • 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_REPLACEREGEXP_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正規表現構文大文字小文字の扱い備考
PostgreSQLcolumn ~ 'pattern'デフォルトで区別あり~*で区別なしも可能
MySQLcolumn REGEXP 'pattern'デフォルトで区別なしRLIKEも同じ機能
OracleREGEXP_LIKE(column, 'pattern')オプションで指定可能関数形式、他の関数も豊富

コメント

タイトルとURLをコピーしました