Сравнивает строки, если они содержат подстроки в любом порядке - PullRequest
0 голосов
/ 21 марта 2019

Допустим, у нас есть строка, такая как

AABBCCDDEEFFGG

Она содержит 7 подстрок

AA BB CC DD EE FF GG

Теперь давайте реорганизуем порядок, пока новая строка содержит подстрокуСтроки, то мы думаем, что они равны.Новая строка

AACCFFGGEEBBDD

Она была изменена в следующем порядке:

AA CC FF GG EE BB DD

У меня много комбинаций из подстрок.Каждая подстрока имеет ровно два символа.Как я могу сравнить длинную строку с такой же в хранимой процедуре?Допустим, старая строка взята из базы данных, а новая - из входного параметра.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вы можете создать функцию, которая разбивает строки и сравнивает строки.

CREATE OR REPLACE FUNCTION compare_str (
     p_str1 VARCHAR2,
     p_str2 VARCHAR2
) RETURN INTEGER AS
     TYPE strytype IS
          TABLE OF VARCHAR2(100);
     str_t1   strytype;
     str_t2   strytype;
BEGIN
     SELECT substr(p_str1, (level - 1) * 2 + 1,2) AS ch BULK COLLECT
        INTO str_t1
     FROM dual CONNECT BY
          level <= length(p_str1) / 2
     ORDER BY ch;

     SELECT substr(p_str2, (level - 1) * 2 + 1,2) AS ch BULK COLLECT
     INTO str_t2
     FROM dual CONNECT BY
          level <= length(p_str2) / 2
     ORDER BY ch;

     IF str_t1 = str_t2
     THEN
          RETURN 1;
     ELSE
          RETURN 0;
     END IF;
END;
/

Итак, в ваших запросах или процедурах вы можете просто вызывать функцию, передавая соответствующие столбцы / строки в качестве аргументов.

select compare_str('AABBCCDDEEFFGG','AACCFFGGEEBBDD') from dual;

1

DEMO

0 голосов
/ 21 марта 2019

Вы можете использовать функцию ниже

create or replace function str_comparison ( i_String1 varchar2, i_String2 varchar2 )
                     return pls_integer is
  o_result pls_integer;
begin
  with t(str1,str2) as
  (
   select i_String1, i_String2 from dual
  ), t2(s_str1,s_str2) as
  (
  select substr(str1,-2*level,2),
         substr(str2,-2*level,2)
    from t
   connect by level <= length(str1)/2
  ), t3 as
  (
  select listagg(s_str1) within group ( order by s_str1 )
         as str1,
         listagg(s_str2) within group ( order by s_str2 )
         as str2
    from t2
  )
  select decode(str1,str2,1,0)
    into o_result
    from t3;

  return o_result;
end;

и см. Подстановку AACCFFGGEEBBDD и AABBCCDDEEFFGG для аргументов, которые приводят к выводу 1, показывающие, что эти строки идентичны, когда они упорядочены из-за вашей логики, в противном случае вы получите 0 (ноль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...