加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 计算两个字符串oracle中的顺序匹配单词

发布时间:2020-12-12 06:32:35 所属栏目:MsSql教程 来源:网络整理
导读:我想要一个查询,返回两个字符串中的单词的顺序匹配数 例: 表 Id column1 column2 result 1 'foo bar live' 'foo bar' 2 2 'foo live tele' 'foo tele' 1 3 'bar foo live' 'foo bar live' 0 获取我正在使用的总发生次数: select id,column1,column2,extract
我想要一个查询,返回两个字符串中的单词的顺序匹配数
例:

Id  column1               column2     result   
1   'foo bar live'        'foo bar'       2  
2   'foo live tele'       'foo tele'      1  
3   'bar foo live'        'foo bar live'  0

获取我正在使用的总发生次数:

select id,column1,column2,extractvalue(dbms_xmlgen.getxmltype('select cardinality (
  sys.dbms_debug_vc2coll(''' || replace(lower(column1),' ',''',''' ) || ''') multiset intersect
  sys.dbms_debug_vc2coll('''||replace(lower(column2),''' )||'''))  x from dual'),'//text()') cnt
from table.

任何人都可以建议在类似的行上查询顺序匹配,因为我想要连续匹配的数量和一起显示的出现次数.

解决方法

就个人而言,在这种情况下,我会选择PL / SQL代码而不是普通的SQL.就像是:

包装规格:

create or replace package PKG is
  function NumOfSeqWords(
    p_str1 in varchar2,p_str2 in varchar2
  ) return number;
end;

包装体:

create or replace package body PKG is
  function NumOfSeqWords(
    p_str1 in varchar2,p_str2 in varchar2
  ) return number
  is
    l_str1     varchar2(4000) := p_str1;
    l_str2     varchar2(4000) := p_str2;
    l_res      number  default 0;
    l_del_pos1 number;
    l_del_pos2 number;
    l_word1    varchar2(1000);
    l_word2    varchar2(1000);
  begin
    loop
      l_del_pos1 := instr(l_str1,' ');
      l_del_pos2 := instr(l_str2,' ');
      case l_del_pos1
        when 0 
        then l_word1 := l_str1;
             l_str1 := ''; 
        else l_word1 := substr(l_str1,1,l_del_pos1 - 1);
      end case;
      case l_del_pos2
        when 0 
        then l_word2 := l_str2;
             l_str2 := ''; 
        else l_word2 := substr(l_str2,l_del_pos2 - 1);
      end case;
      exit when (l_word1 <> l_word2) or 
                ((l_word1 is null) or (l_word2 is null));

      l_res := l_res + 1;
      l_str1 := substr(l_str1,l_del_pos1 + 1);
      l_str2 := substr(l_str2,l_del_pos2 + 1);
    end loop;
    return l_res;
  end;
end;

测试用例:

with t1(Id1,col1,col2) as(
   select 1,'foo bar live','foo bar'     from dual union all
   select 2,'foo live tele','foo tele'    from dual union all
   select 3,'bar foo live','foo bar live'from dual
  )
  select id1,col2,pkg.NumOfSeqWords(col1,col2) as res
    from t1
  ;

结果:

ID1 COL1          COL2                RES
---------- ------------- ------------ ----------
         1 foo bar live  foo bar               2
         2 foo live tele foo tele              1
         3 bar foo live  foo bar live          0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读