複雑なデータ整形やログ解析、動的なクエリ生成が求められるシーンでは、通常の文字列関数では限界があることも。そこで登場するのが、正規表現による柔軟なパターン操作と、動的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の限界を超える「文字列×動的処理」の世界に触れてみてください。