sql – 计算两个字符串oracle中的顺序匹配单词
发布时间:2020-05-28 17:24:48 所属栏目:MsSql 来源:互联网
导读:我想要一个查询,返回两个字符串中的单词的顺序匹配数 例: 表 Id column1 column2 result 1 foo bar live foo bar 2 2 foo live tele foo tele 1 3 bar foo live fo
|
我想要一个查询,返回两个字符串中的单词的顺序匹配数
表 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 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- sql-server – 如何从截断的表中恢复数据
- SQL – 当有重复时选择最新的记录
- SQL Server Management Studio Express和MySQL?
- SQL Server 一次性压缩Sqlserver2005中所有库日志
- MySql使用skip-name-resolve解决外网链接客户端过
- tsql – SQL_Latin1_General_CP1_CI_AS和SQL_Lat
- SQL Server 2005的cmd_shell组件的开启方法
- sql 去零函数 datagridview中数字类型常出现后面
- sql – 检查Postgres复合字段是否为空/空
- sql-server – SQL Server 2008 – 分区和聚簇索
热点阅读
