トップページに戻る    次の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ストアドプロシージャを使う方法では、
正規表現で、
[^\[](?=[^\[]*\])
を#に置換してから、
角括弧を削除しています。