トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-271 角括弧の中身を指定文字に置換
SQLパズル
StrTable
Val
------------------------------------------------------------------
[karthick] account number is [10000010101] and my pin is [1919128]
[michael] account number is [11110010010101] and my pin is [9876]
[\ake\ti\] aaa [999] bbb [111]
角括弧(ブラケット)に囲まれた文字を#に変換し、
角括弧を削除した文字列を求める。
出力結果
Val
------------------------------------------------------------
######## account number is ########### and my pin is #######
####### account number is ############## and my pin is ####
######## aaa ### bbb ###
データ作成スクリプト
create table StrTable(Val varchar2(70));
insert into StrTable values('[karthick] account number is [10000010101] and my pin is [1919128]');
insert into StrTable values('[michael] account number is [11110010010101] and my pin is [9876]');
insert into StrTable values('[\ake\ti\] aaa [999] bbb [111]');
commit;
SQL
--■■■PL/SQLを使う方法■■■
create or replace function masked(hikiStr Varchar2) return Varchar2 is
InFlag boolean;
willReturn varchar2(200);
begin
for i in 1..length(hikiStr) Loop
if substr(hikiStr,i,1) = '[' then
InFlag := true;
elsif substr(hikiStr,i,1) = ']' then
InFlag := false;
elsif InFlag then
willReturn := willReturn || '#';
else
willReturn := willReturn || substr(hikiStr,i,1);
end if;
end Loop;
return willReturn;
end;
/
select masked(Val) as Val
from StrTable
order by Val;
--■■■Javaストアドプロシージャを使う方法■■■
exec dbms_java.dropjava('JavaRegexSource');
exec dbms_java.dropjava('JavaRegex');
CREATE or replace JAVA SOURCE NAMED JavaRegexSource as
public class JavaRegex {
public static String execRegex(String hiki){
return hiki.replaceAll("[^\\[](?=[^\\[]*\\])","#");
}
}
/
CREATE OR REPLACE Function ExecJavaRegex(hiki varchar2) return varchar2
AS LANGUAGE java NAME 'JavaRegex.execRegex(java.lang.String) return java.lang.String';
/
conn test/test@test
col Val for a70
select regexp_replace(ExecJavaRegex(Val),'\[|\]') as Val
from StrTable
order by Val;
解説
Javaストアドプロシージャを使う方法では、
正規表現で、
[^\[](?=[^\[]*\])
を#に置換してから、
角括弧を削除しています。