トップページに戻る
次の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)?
とほぼ同じ意味です。