如何计算ORACLE循环中字符串中出现的每个单词?

时间:2012-01-23 17:18:25

标签: string oracle count split procedure

我有一个问题,起初看起来很简单,但事实并非如此。我将字词存储在表格中,使得字符串“A B C D E”和“D E F”成为:

id  value
--  -----
1   A
1   B
1   C
1   D
1   E
2   D
2   E
2   F

我传递给我的ORACLE过程字符串,如下所示:“A B C D G”。现在我想检查数据库中字符串与作为参数传递的字符串之间的相似性百分比。

我认为我必须使用split函数之一并使用数组。稍后检查传递的字符串中的每个单词是否出现在表中,然后计算ID。但有一个转折:我需要精确的百分比价值。

因此,上面示例的结果应如下所示:

id percentage
-- ----------
1  80              -- 4 out of 5 letters exists in query string (A B C D)
2  33              -- 1 out of 3 (D)

所以,我的问题是:

  • 什么是拆分查询字符串然后迭代它的最有效方法(表?)
  • 如何存储部分结果然后计算它们?
  • 如何计算最终百分比值?

非常感谢每一位帮助。

2 个答案:

答案 0 :(得分:2)

以下查询可以为您提供所需的内容,而无需费心处理程序。

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

如果您使用下面建议的索引,这些操作涉及全面扫描表或索引完全扫描,因此如果您只想查找具有百分比&gt;的ids,则可能需要添加以下where子句。 0

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

对于所有查询,您的表格应按此顺序在my_table, id上编入索引。

答案 1 :(得分:0)

你看过UTL_MATCH了吗?它并不完全符合您的要求,但如果您的百分比协议的定义不是一成不变的话,您可能会发现它很有用。