String 如何计算ORACLE循环中字符串中出现的每个单词?
我有一个问题,一开始看起来很简单,但事实并非如此。我将单词存储在一个表中,使一对字符串“abcde”和“def”变成: 我传递给我的ORACLE过程字符串,它看起来像这样:“abcdg”。现在我想检查数据库中字符串和作为参数传递的字符串之间的相似性百分比 我假设我必须使用一个拆分函数和一个数组。稍后检查传递字符串中的每个单词是否出现在表中,然后计算ID。但有一个转折点:我需要精确的百分比值 所以,上面示例的结果应该如下所示:String 如何计算ORACLE循环中字符串中出现的每个单词?,string,oracle,count,split,procedure,String,Oracle,Count,Split,Procedure,我有一个问题,一开始看起来很简单,但事实并非如此。我将单词存储在一个表中,使一对字符串“abcde”和“def”变成: 我传递给我的ORACLE过程字符串,它看起来像这样:“abcdg”。现在我想检查数据库中字符串和作为参数传递的字符串之间的相似性百分比 我假设我必须使用一个拆分函数和一个数组。稍后检查传递字符串中的每个单词是否出现在表中,然后计算ID。但有一个转折点:我需要精确的百分比值 所以,上面示例的结果应该如下所示: id percentage -- ---------- 1 80
id percentage
-- ----------
1 80 -- 4 out of 5 letters exists in query string (A B C D)
2 33 -- 1 out of 3 (D)
因此,我的问题是:
- 拆分查询字符串然后对其进行迭代(表?)最有效的方法是什么
- 如何存储部分结果,然后对其进行计数
- 如何计算最终的百分比值
非常感谢您的帮助。下面的查询将为您提供所需的信息,而无需繁琐的程序
select id
, sum(case when value in ('A', 'B', 'C', 'D', G') then 1 else 0 ) / count(*)
from my_table
group by id
或者,如果要传递字符串“A B C D G”并返回结果,您可以执行以下操作:
select id
, sum(case when instr('A B C D G', value) <> 0 then 1 else 0 ) / count(*)
from my_table
group by id
对于所有查询,您的表都应该按此顺序在my_table,id上建立索引。您看过了吗?它并不能完全实现您想要实现的目标,但如果您对百分比协议的定义不是一成不变的,您可能会发现它很有用。谢谢!你的解决方案帮了我很大的忙,它不是我所需要的,但它把我推向了正确的方向。毕竟,我必须使用split,因为我需要计算任何值的每次出现次数,而不是整个字符串。因此,在我的例子中,我必须使用类似于:sum(当值in('A','B','C','d','G')的情况下,那么1其他0)/count(*)所以传递的字符串必须被拆分:/嗯,当你改变参数顺序时,它工作:)instr(值,'abcdg')不工作,但instr('abcdg',值)工作得很好。谢谢你,本!哦@Ziouas,是的。。。很抱歉,我习惯用另一种方式写。我已经编辑了我的答案,所以现在它更有意义了!好的,谢谢!我花了一段时间才弄明白为什么它不起作用;)哇,真的很好的函数集,但不是我的目标。字符串“AB”和“A C D B”的相似性应为50%(2个精确匹配),在此算法中,它
s 72%(Jaro Wnkler)或43%(编辑距离)。但我
将在将来研究它。竖起大拇指!
select id
, sum(case when instr('A B C D G', value) <> 0 then 1 else 0 ) / count(*)
from my_table
group by id
select id
, sum(case when instr('A B C D G', value) <> 0 then 1 else 0 ) / count(*)
from my_table
where exists ( select 1
from my_table
where id = mt.id
and instr('A B C D G', value) <> 0 )
group by id