PL/SQL函数
create or replace function get_pattern(p_string in varchar2) return varchar2 is
v_translated_string varchar2(4000) := p_string;
v_pattern varchar2(4000);
v_same_character_counter number := 1;
begin
--Convert characters.
v_translated_string := regexp_replace(v_translated_string, '[a-zA-Z]', 'a');
v_translated_string := regexp_replace(v_translated_string, '[0-9]', 'd');
v_translated_string := replace(v_translated_string, ' ', '_');
v_translated_string := regexp_replace(v_translated_string, '[^da\_]', 'p');
--Count and convert to pattern.
for i in 1 .. length(v_translated_string) loop
if i = length(v_translated_string) then
v_pattern := v_pattern || substr(v_translated_string, i, 1)||v_same_character_counter;
elsif substr(v_translated_string, i, 1) = substr(v_translated_string, i+1, 1) then
v_same_character_counter := v_same_character_counter+1;
else
v_pattern := v_pattern || substr(v_translated_string, i, 1)||v_same_character_counter;
v_same_character_counter := 1;
end if;
end loop;
return replace(v_pattern, '1', null);
end;
/
测试查询
select string, expected_pattern, get_pattern(string) actual_pattern
from
(
select '???' string, 'p3' expected_pattern from dual union all
select '51213' string, 'd5' expected_pattern from dual union all
select 'F680' string, 'ad3' expected_pattern from dual union all
select '7D' string, 'da' expected_pattern from dual union all
select '%%' string, 'p2' expected_pattern from dual union all
select '.85' string, 'pd2' expected_pattern from dual union all
select '1.25' string, 'dpd2' expected_pattern from dual union all
select 'SATZ A123' string, 'a4_ad3' expected_pattern from dual union all
select 'SAT1 1A23B' string, 'a3d_dad2a' expected_pattern from dual
);
结果
STRING EXPECTED_PATTERN ACTUAL_PATTERN
??? p3 p3
51213 d5 d5
F680 ad3 ad3
7D da da
%% p2 p2
.85 pd2 pd2
1.25 dpd2 dpd2
SATZ A123 a4_ad3 a4_ad3
SAT1 1A23B a3d_dad2a a3d_dad2a