トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-253 同じ文字列が2回現れるかを調べる
SQLパズル
strTable
str
-----------------------------------------
x!x
x!x!y!z
y!x!x!z
y!z!x!x
x!y!x!z
y!x!z!x
w!x!y!x!z
str1!str1!str2
str1!str2!str1
str1!str2!str3!str2!str4
w!x!y!z
x!str1!str!1!tr!str2!_str2!2!str2_!str3!3
AAAA!x!y
AAAA!AAA!y
区切り文字を!として、
同じ文字列が存在するstrを出力する。
出力結果
str
------------------------
x!x
x!x!y!z
y!x!x!z
y!z!x!x
x!y!x!z
y!x!z!x
w!x!y!x!z
str1!str1!str2
str1!str2!str1
str1!str2!str3!str2!str4
データ作成スクリプト
create table strTable(str) as
select 'x!x' from dual union all
select 'x!x!y!z' from dual union all
select 'y!x!x!z' from dual union all
select 'y!z!x!x' from dual union all
select 'x!y!x!z' from dual union all
select 'y!x!z!x' from dual union all
select 'w!x!y!x!z' from dual union all
select 'str1!str1!str2' from dual union all
select 'str1!str2!str1' from dual union all
select 'str1!str2!str3!str2!str4' from dual union all
select 'w!x!y!z' from dual union all
select 'x!str1!str!1!tr!str2!_str2!2!str2_!str3!3' from dual union all
select 'AAAA!x!y' from dual union all
select 'AAAA!AAA!y' from dual;
SQL
select str
from strTable
where RegExp_Like(str,'(^|!)([^!]+)!(.+!)?\2(!|$)');
解説
select str,RegExp_Substr(str,'(^|!)([^!]+)!(.+!)?\2(!|$)') as match
from strTable
where RegExp_Like(str,'(^|!)([^!]+)!(.+!)?\2(!|$)');
といったSQLを使えば、RegExp_Like述語に指定したパターンを
RegExp_Substr関数でどこがマッチしたか調べることができます。
正規表現を試行錯誤する際に使うといいでしょう。