トップページに戻る    次の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関数でどこがマッチしたか調べることができます。

正規表現を試行錯誤する際に使うといいでしょう。