比较字符串是否包含子字符串(无论顺序如何)

时间:2019-03-20 23:29:30

标签: oracle plsql

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

AABBCCDDEEFFGG

它包含7个子字符串

AA BB CC DD EE FF GG

现在,只要新字符串包含子字符串,我们就可以重新组织顺序,那么我们认为它们是相等的。新的字符串是

AACCFFGGEEBBDD

它只是将顺序更改为

AA CC FF GG EE BB DD

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

2 个答案:

答案 0 :(得分:1)

您可以创建一个将字符串分割并比较字符串的函数。

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

答案 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;

,请参见用替换AACCFFGGEEBBDDAABBCCDDEEFFGG替换参数yield 1,显示由于逻辑原因,这些字符串在每次排序时都是相同的,否则得到0(零)。