Oracle 如果包含子字符串(无论顺序如何),则比较字符串

Oracle 如果包含子字符串(无论顺序如何),则比较字符串,oracle,plsql,Oracle,Plsql,假设我们有一个字符串,比如 AABBCCDDEEFFGG 它包含7个子字符串 AA BB CC DD EE FF GG 现在让我们重新组织顺序,只要新字符串包含子字符串,那么我们认为它们是相等的。新字符串是 AACCFFGGEEBBDD 只是把顺序改成了 AA CC FF GG EE BB DD 我有许多子字符串的组合。每个子字符串正好有两个字符。如何将长字符串与存储过程中的相同字符串进行比较?假设旧字符串来自数据库,新字符串来自输入参数。您可以创建一个函数来拆分字符串并比较字符串 CR

假设我们有一个字符串,比如

AABBCCDDEEFFGG
它包含7个子字符串

AA BB CC DD EE FF GG
现在让我们重新组织顺序,只要新字符串包含子字符串,那么我们认为它们是相等的。新字符串是

AACCFFGGEEBBDD
只是把顺序改成了

AA CC FF GG EE BB DD

我有许多子字符串的组合。每个子字符串正好有两个字符。如何将长字符串与存储过程中的相同字符串进行比较?假设旧字符串来自数据库,新字符串来自输入参数。

您可以创建一个函数来拆分字符串并比较字符串

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;
/

您可以使用下面的功能

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替换参数yield 1,该参数表示由于逻辑原因,无论何时排序,这些字符串都是相同的,否则将得到0零。

如何定义子字符串?是不是只有两个连续的字符?是的,没错,非常感谢。
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;