トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-267 RegExp_Replace関数で区切りデータより抽出

SQLパズル

regTable
str
----------------------------------------------
BOB13;MTCIN23;123IN14
MOCS13;M100IN14;111IN14;123IN14
MOCS13;MTCIN13;MTCIN14
MOCS13;MTCIN13;MTCIN14;100IN14;111IN14;123IN14
MTCIN11;123IN14;MTC123X
MTCIN13;MTCIN14;100IN14;111IN14;123IN14

セミコロンを区切りとして、
MTCから始まるデータのみを抽出する。

出力結果
str                                             derivedStr
----------------------------------------------  ---------------
BOB13;MTCIN23;123IN14                           MTCIN23
MOCS13;M100IN14;111IN14;123IN14                 null
MOCS13;MTCIN13;MTCIN14                          MTCIN13;MTCIN14
MOCS13;MTCIN13;MTCIN14;100IN14;111IN14;123IN14  MTCIN13;MTCIN14
MTCIN11;123IN14;MTC123X                         MTCIN11;MTC123X
MTCIN13;MTCIN14;100IN14;111IN14;123IN14         MTCIN13;MTCIN14

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table regTable(str) as
select 'BOB13;MTCIN23;123IN14' from dual union
select 'MOCS13;M100IN14;111IN14;123IN14' from dual union
select 'MOCS13;MTCIN13;MTCIN14' from dual union
select 'MOCS13;MTCIN13;MTCIN14;100IN14;111IN14;123IN14' from dual union
select 'MTCIN11;123IN14;MTC123X' from dual union
select 'MTCIN13;MTCIN14;100IN14;111IN14;123IN14' from dual;


SQL

col derivedStr for a20

select str,
Ltrim(
RegExp_Replace(str,'(^|;)(MTC[^;]+)|.','\1\2')
,';') as derivedStr
  from regTable;


解説

Oracleの正規表現では、選択が左優先であることを使ってます。

10-264 正規表現のリキャプチャ
5-24 置換を使ってCSVからデータ抽出

US-OTN --- Hahaha today I say it twice
CD氏スペシャルの使用例

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Oracleの正規表現は、選択で左優先なことの理解を深めるかもしれないサンプル

SQL> select str,
  2  RegExp_Substr(str,'|ab') as matchStr1,
  3  RegExp_Substr(str,'ab|') as matchStr2
  4    from (select 'ab' as str from dual union
  5          select 'abc' from dual union
  6          select 'def' from dual)
  7   where RegExp_Like('abc','|ab');

STR  MATCHS1  MATCHS2
---  -------  -------
ab   null     ab
abc  null     ab
def  null     null

詳説 正規表現 3版 135ページに書いてありますが、
(this|that|)
は
(this|that)?
とほぼ同じ意味です。