次に、REGEXP_INSTR関数です。指定した正規表現に一致する部分が何文字目かを返します。
構文 REGEXP_INSTR(文字列または列名,条件)
SQL> SELECT COL1,REGEXP_INSTR(COL1,'[0-9]') , 2 REGEXP_INSTR(COL1,'%') from TEST_REGEXP; COL1 REGEXP_INSTR(COL1,'[0-9]') REGEXP_INSTR(COL1,'%') ---------- -------------------------- ---------------------- ABCDE01234 6 0 01234ABCDE 1 0 @|=)(9&%$# 6 8 あいうえ3 5 0 6 rows selected.
「N文字目以降に数字が出現するのは?」と制限する場合はこんな感じ。
SQL> SELECT COL1,REGEXP_INSTR(COL1,'[0-9]',4) FROM TEST_REGEXP; COL1 REGEXP_INSTR(COL1,'[0-9]',4) ---------- ---------------------------- ABCDE01234 6 01234ABCDE 4 abcde01234 6 01234abcde 4
さらに、REGEXP_SUBSTR関数では、指定した正規表現に一致する部分を抜き出し結果として返します。
構文 REGEXP_SUBSTR(文字列または列名,条件)
SQL> SELECT COL1,REGEXP_SUBSTR(COL1,'[C-Z]+') FROM TEST_REGEXP; COL1 REGEXP_SUBSTR(COL1,'[C-Z]') ---------- --------------------------- ABCDE01234 CDE 01234ABCDE CDE abcde01234 01234abcde
SQL> SELECT COL1,REGEXP_SUBSTR(COL1,'[C-Z]') FROM TEST_REGEXP; COL1 REGEXP_SUBSTR(COL1,'[C-Z]') ---------- --------------------------- ABCDE01234 C 01234ABCDE C abcde01234 01234abcde
最後に、REGEXP_REPLACE関数。指定した正規表現に一致する部分を、指定した別の文字列に置き換えます。
構文 REGEXP_REPLACE(列名または文字列,条件,置き換え文字列)
SQL> SELECT COL1,REGEXP_REPLACE(COL1,'[0-2]+','*') FROM TEST_REGEXP; COL1 REGEXP_REPLACE(COL1,'[0-2]+','*') ---------- -------------------------------------------------- ABCDE01234 ABCDE*34 01234ABCDE *34ABCDE abcde01234 abcde*34 01234abcde *34abcde
SQL文で正規表現が可能になったことで、いままではちょっとした小細工(PL/SQLや条件式の羅列)が必要であった作業が簡単に実現できるようになりました。例えば電子メールや郵便番号(海外などでは英字も含まれる)格納列への検索・入力チェックも簡単です。そのほか、データベース移行時に問題となる外字の検出、不要な空白文字の検出、重複語の出現の識別および文字列の解析・置換などにも威力を発揮します。
以上のように、Oracle10gでのちょっとしたSQL操作に関する機能の追加ですが、知っていると大変便利です。ぜひ活用してみてはいかがでしょうか。(次回に続く)
@IT関連記事
Insider.NETフォーラム
▼基礎解説 スマートな文字列処理のための正規表現入門
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.