Мне понадобилось сравнивать две строки по сигнатурам (вхождениям символов в строку), то есть строки <A><B><C> и <B><A><C> в моем случае должны быть равны. Я, например, использую это сравнение при анализе имеющихся у таблицы индексов, чтобы в коде понять, проиндексирован ли интересующий меня список столбцов, если на входе у меня есть только строки с перечислением имен этих столбцов, чтобы отбросить дублированные списки.
declare
l_1 varchar2(1024) := '<a><b><c>';
l_2 varchar2(1024) := '<b><c><a>';
l_equal varchar2(32);
begin
select
decode(count(*),0,'EQUAL', 'NOT EQUAL') is_equal
into
l_equal
from
(select regexp_substr(l_1, '\<[^>]*\>',1,level,'i') chunk from dual t1 connect by regexp_substr(l_1, '\<[^>]*\>',1,level,'i') is not null) t1
full outer join (select regexp_substr(l_2, '\<[^>]*\>',1,level,'i') chunk from dual t2 connect by regexp_substr(l_2, '\<[^>]*\>',1,level,'i') is not null) t2on t1.chunk = t2.chunk
where t1.chunk is null or t2.chunk is null;
dbms_output.put_line(l_equal);
end;