隐藏/替换(用astric' *')pl / sql

时间:2016-04-13 07:06:33

标签: oracle plsql

我想隐藏/替换(用星号*)pl / sql中字符串中的某些字符,例如,在某些忘记密码选项的网站中,它们显示电子邮件ID或电话号码,如:

p******bh****@y****.**.in

+91 9**** **160

我想显示由"_" or "." or "@"分隔的每个单词的第一个和最后一个字符。
所有其他字符应显示为星号"*"

有关此问题的任何帮助吗?

1 个答案:

答案 0 :(得分:0)

您可以根据自己的需要编写,编译和使用此功能,可能需要进行一些调整:

create or replace function stars(i_str in varchar2) return varchar2 is
  type     chars is table of char(1);
  v_show   chars := chars('@', ' ', '.', '+', '_');
  v_output varchar2(100) := '';
begin
  for i in 1 .. length(i_str) loop
    if i = 1 or i = length(i_str) 
      or substr(i_str, i - 1, 1) member of v_show 
      or substr(i_str, i + 1, 1) member of v_show 
      or substr(i_str, i, 1) member of v_show 
    then
      v_output := v_output || substr(i_str, i, 1);
    else
      v_output := v_output || '*';
    end if;
  end loop;
  return v_output;
end;

测试:

with test as (
  select 'pabcdefb_habch@yabcy.abc.in' as str from dual union all
  select '+91 91238 51230' from dual union all
  select 'PBhagat'         from dual union all
  select 'Stack Overflow'  from dual)
select str, stars(str) as output from test

STR                          OUTPUT
---------------------------  ---------------------------
pabcdefb_habch@yabcy.abc.in  p******b_h***h@y***y.a*c.in
+91 91238 51230              +91 9***8 5***0
PBhagat                      P*****t
Stack Overflow               S***k O******w