テックカリキュラム

正規表現と文字列操作の限界突破

正規表現と文字列操作の限界突破

複雑なデータ整形やログ解析、動的なクエリ生成が求められるシーンでは、通常の文字列関数では限界があることも。そこで登場するのが、正規表現による柔軟なパターン操作と、動的SQLの生成・実行というテクニックです。本記事では、それらを駆使して「文字列操作の壁」を突破する実践例を紹介します。


正規表現ベースの抽出と置換

正規表現(Regex)は、特定の文字パターンを効率的に処理するための表現方法であり、ログ分析・データクレンジング・フォーマット変換などに活躍します。

PostgreSQLの正規表現関数

  • REGEXP_REPLACE:パターンに一致した文字列を置換
  • REGEXP_MATCHES:複数の一致結果を配列で取得
  • SUBSTRING(... FROM ...):正規表現による部分抽出
-- 電話番号からハイフンを除去 SELECT REGEXP_REPLACE('090-1234-5678', '-', '', 'g'); -- → 09012345678 -- メールアドレスのドメイン抽出 SELECT SUBSTRING('user@example.com' FROM '@(.+)$'); -- → example.com 

MySQLの正規表現関数(8.0以降)

  • REGEXP_REPLACE:正規表現による置換
  • REGEXP_SUBSTR:部分一致の抽出
-- カンマ区切りから1つ目の項目を抽出 SELECT REGEXP_SUBSTR('apple,banana,orange', '^[^,]+'); -- → apple -- HTMLタグを除去 SELECT REGEXP_REPLACE('<b>Hello</b>', '<[^>]+>', ''); -- → Hello 

応用:数値だけを抽出(ノイズ混入データのクレンジング)

SELECT REGEXP_REPLACE('¥1,234.56', '[^0-9.]', '', 'g'); -- → 1234.56 

このように、正規表現を使えばパターンベースでの抽出・置換が簡潔に記述可能になります。


動的SQLの生成と実行

テーブル名や列名が可変な場面では、通常の静的SQLでは対応できません。そんなときは動的SQL(Dynamic SQL)を使って、柔軟な処理を実現します。

PostgreSQL(PL/pgSQL)での動的SQL

DO $$ DECLARE tbl TEXT := 'sales_2025'; sql TEXT; BEGIN sql := 'DELETE FROM ' || quote_ident(tbl) || ' WHERE sale_date < CURRENT_DATE - INTERVAL ''1 year'''; EXECUTE sql; END $$; 

ポイント: EXECUTEでSQL文字列を実行し、quote_identでSQLインジェクションを防ぎます。

MySQLでの動的SQL(ストアドプロシージャ)

DELIMITER $$ CREATE PROCEDURE drop_table_if_exists(IN tbl_name VARCHAR(100)) BEGIN SET @sql = CONCAT('DROP TABLE IF EXISTS ', tbl_name); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER ; 

MySQLでは PREPARE / EXECUTE を使うことで、ストアドプロシージャ内での柔軟なSQL組み立てが可能になります。

応用:動的SQL × 正規表現の合わせ技

正規表現で抽出した結果を使って、動的にUPDATE対象カラムを決めるような高度な処理も可能です。

-- PostgreSQL: 動的に更新対象の列を切り替える DO $$ DECLARE column_name TEXT := 'email'; update_sql TEXT; BEGIN update_sql := format('UPDATE users SET %I = lower(%I)', column_name, column_name); EXECUTE update_sql; END $$; 

動的SQLを使う際の注意点:

  • SQLインジェクション対策: quote_ident, format, プレースホルダを使う
  • 実行ログの記録: ログテーブルにSQLを記録する仕組みを検討
  • テスト環境での動作確認必須

まとめ

文字列処理と動的SQLは、SQLの中でも柔軟性と表現力が問われる高度な分野です。使いこなすことで、次のようなシーンで威力を発揮します:

  • ログデータからの複雑なパターン抽出
  • HTMLタグ・特殊文字の除去や変換
  • スキーマや期間に応じた動的なテーブル操作

ぜひこの機会に、SQLの限界を超える「文字列×動的処理」の世界に触れてみてください。