Oracle SQL中的高级字符串比较

Phi*_*lip 5 string oracle string-comparison

我想知道在Oracle SQL中是否有一种方法可以比较两个字符串以寻找除=or 之外的相似之处like.例如,SQL Server有一个difference(str1, str2)比较两个字符串并给出相似性评级(0到4)的函数.不完全是我想要的,但这仍然非常有帮助.

我希望专门针对以下功能或方法:

  1. 逐字符比较字符串(返回完全匹配的数量)
  2. 告诉一个字符串中有多少个字符,但是在错误的位置

主要用途是包含相同长度的字符串,包含数字(ID,电话号码等).出于我的目的,我会用它来查找字母/数字可能已被转置的可能匹配. Soundex(string)适用于alpha字符串,但似乎忽略了数字(有充分理由).

我没有权限自己创建函数,但如果有人知道这样做的方法,我会有兴趣听到它.比较char-to-char的一种解决方案(仅在知道MAX字符数时才有效)是:

 --For char-to-char counts
    Decode(substr(ID1,1,1),  substr(ID2,1,1), 1,  0) +
    Decode(substr(ID1,2,1),  substr(ID2,2,1), 1,  0) +
    [...]
    Decode(substr(ID1,N,1),  substr(ID2,N,1), 1,  0)
Run Code Online (Sandbox Code Playgroud)

但这就像你能得到的那样不那么优雅.

任何帮助将不胜感激.

Jus*_*ave 20

听起来你正在寻找UTL_MATCH包

SELECT utl_match.edit_distance( string1, string2 )
  FROM dual
Run Code Online (Sandbox Code Playgroud)

告诉你将string1转换为string2所需的编辑次数

SQL> select utl_match.edit_distance( 'Bear', 'berry' ) from dual;

UTL_MATCH.EDIT_DISTANCE('BEAR','BERRY')
---------------------------------------
                                      3
Run Code Online (Sandbox Code Playgroud)

还有一些相似性函数EDIT_DISTANCE_SIMILARITY,JARO_WINKLER_SIMILARITY它们给出0到100之间的相似性分数,让您了解字符串的相似程度.