本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)
Oracle Database 10g で新規に追加された正規表現機能は、テキスト形式データを扱うための強力なツールです。これによりSQLを使用した文字データを検索し、操作する能力が大幅に向上します。
UNIXユーザーには大変なじみの深い正規表現。Oracle 10gで(やっと!?)実現されました。いままではWHERE句の中で“LIKE”とともに使用する「%」や「_」などでしか表現できなかったあいまいな文字列を、正規表現を使用することで文字数やその種類まで指定できるようになり大変便利になりました。
今回は、Oracle 10gでサポートされる正規表現(REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_REPLACE関数)を紹介します。
Samples
今回使用するサンプルテーブルの詳細は、以下のリンクから確認してください。
▼sqlclinic01.txt
Oracle9iまでの関数に「REGEXP_」が付加され正規表現用の関数になりました(表1参照)。順番に操作方法を確認していきます。
関数名称 | 構文 | 説明 |
---|---|---|
REGEXP_LIKE | REGEXP_LIKE( 列名, 条件 ) |
条件(正規表現)を使ってあいまいな条件検索を実施します。検索対象列では、文字データ型をサポートします(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2およびNCLOBはサポートしますが、LONGはサポートしません) |
REGEXP_INSTR | REGEXP_INSTR( 文字列または列名, 条件 (,開始位置) ) |
指定した条件(正規表現)に一致する部分の最初の位置(何文字目か)を返します。任意に、検索を開始する開始位置を指定することも可能です |
REGEXP_SUBSTR | REGEXP_SUBSTR( 文字列または列名, 条件 ) |
指定した正規表現に一致する部分文字列を抜き出し結果として返します |
REGEXP_REPLACE | REGEXP_REPLACE( 列名または文字列, 条件, 置き換え文字列 ) |
指定した正規表現に一致する部分を、指定した別の文字列に置換します。複雑な置換/検索操作を可能にします |
表1 正規表現を使用する関数 |
まずは、REGEXP_LIKE関数から実行してみましょう。正規表現を使ってあいまいな条件検索を実施するときに利用します。
構文 REGEXP_LIKE(列名,条件)
SQL> SELECT * FROM TEST_REGEXP; COL1 ---------- ABCDE01234 01234ABCDE abcde01234 01234abcde SQL> SELECT * FROM TEST_REGEXP WHERE REGEXP_LIKE(COL1,'[0-9][A-Z]'); COL1 ---------- 01234ABCDE SQL> SELECT * FROM TEST_REGEXP WHERE REGEXP_LIKE(COL1,'[0-9][a-z]'); COL1 ---------- 01234abcde
少し凝ると以下のようなチェック実装も可能です。
SQL> ALTER TABLE QA_MASTER ADD CONSTRAINT QA_NO_CHK CHECK 2 (REGEXP_LIKE(QA_NO, 3 '^([[:alpha:]]{2}-[[:digit:]]{2}-[[:digit:]]{4})$')); Table altered. SQL> INSERT INTO QA_MASTER VALUES('QA-01-0001'); 1 row created. SQL> INSERT INTO QA_MASTER VALUES('00-01-0001'); INSERT INTO QA_MASTER VALUES('00-01-0001') * ERROR at line 1: ORA-02290: check constraint (ORAORA.QA_NO_CHK) violated
このように許容されたデータしか登録できないようなチェックを実装できます。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.