【SQL実践|実務向け】MySQLで文字列操作をマスターする!SUBSTRING関数の実務活用術

導入

データベース運用において、格納された文字列の一部を抽出する作業は日常茶飯事です。例えば、会員IDから特定の属性コードを取り出したり、長いログデータから必要な箇所だけを抜き出したりする際、SUBSTRING関数は非常に強力なツールとなります。この関数を正しく使いこなすことで、アプリケーション側で過度な加工処理を行う必要がなくなり、クエリのみで効率的にデータ整形が可能になります。

基礎知識

SUBSTRING関数は、対象の文字列から「開始位置」と「抽出したい文字数」を指定して、部分的な文字列を切り出す関数です。重要なポイントは、MySQLでは文字列の先頭を「1」としてカウントするという点です。プログラミング言語(JavaやPHP等)では0からカウントする場合が多いため、この「1始まり」という仕様は忘れがちなミスポイントですので注意してください。また、SUBSTR関数はSUBSTRING関数の別名であり、全く同じ動作をします。

実装/解決策

SUBSTRING関数には主に以下の4つの書き方があります。
1. SUBSTRING(str, pos) : posから最後までの文字列を取得
2. SUBSTRING(str FROM pos) : 上記の別構文
3. SUBSTRING(str, pos, len) : posからlen文字分を取得
4. SUBSTRING(str FROM pos FOR len) : 上記の別構文

実務では可読性を高めるために、コードの記述ルールに合わせて使い分けるのが一般的です。特に、住所データからの「都道府県抽出」や、桁数が固定された「区分コードの切り出し」に威力を発揮します。

サンプルプログラム

以下のコードは、実務でよく遭遇するパターンを想定したサンプルです。手元の環境で実行して動作を確認してみてください。

— ユーザーテーブルのメールアドレスからドメイン部分を取り出す例
— ‘@’の位置を検索し、その次の文字から抽出する場合の応用です
SELECT
email,
SUBSTRING(email, INSTR(email, ‘@’) + 1) AS domain_part
FROM
users;

— 商品コードの先頭3文字をカテゴリとして取得し、さらに4文字目から2文字をサブカテゴリとして取得
SELECT
product_code,
SUBSTRING(product_code, 1, 3) AS category,
SUBSTRING(product_code, 4, 2) AS sub_category
FROM
products;

— 日本語(マルチバイト文字)の抽出テスト
— 3文字目から2文字を取得(例: ‘東京都千代田区’ → ‘千代’)
SELECT SUBSTRING(‘東京都千代田区’, 3, 2) AS extracted_text;

応用・注意点

現場で活用する際に注意すべき点は主に3つあります。

1. マルチバイト文字の扱い: MySQLのSUBSTRINGは「文字数」でカウントするため、全角・半角混在の日本語データでも正しく動作します。しかし、文字コードが適切に設定されていない環境では予期せぬ挙動になる可能性があるため、DBの照合順序(Collation)設定には注意してください。
2. 存在しない位置の指定: 開始位置に文字列長以上の数値を指定した場合や、抽出文字数に0以下を指定した場合は、空文字が返されます。エラーにはなりませんが、データの欠損として扱われるため、アプリケーション側でのバリデーション(入力チェック)と併用することをお勧めします。
3. パフォーマンス: 大規模なテーブルでWHERE句にSUBSTRINGを使用すると、インデックスが効かなくなる(フルテーブルスキャンが発生する)というリスクがあります。検索条件として頻繁に使用する場合は、関数で加工するのではなく、カラムを分割して保持するか、生成カラム(Generated Columns)を使用してインデックスを貼る設計を検討してください。

コメント

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