假设我有一个字符串表,如下所示:
VAL
-----------------
Content of values
Values identity
Triple combo
my combo
sub-zero combo
我想找到字数相等的字符串。结果集应该像
VAL MATCHING_VAL
------------------ ------------------
Content of values Values identity
Triple combo My combo
Triple combo sub-zero combo
或者至少是这样的。 你能帮忙吗?
答案 0 :(得分:7)
一种方法是使用hack进行正则表达式:
select t1.val, t2.val
from t t1 join
t t2
on regexp_like(t1.val, replace(t2.val, ' ', '|');
您可能希望案例也相同:
on regexp_like(lower(t1.val), replace(lower(t2.val), ' ', '|');
答案 1 :(得分:1)
您可以使用SUBSTRING和LIKE的组合。
使用charIndex(“”)在子字符串中拆分单词,如果这就是你要做的事情。
答案 2 :(得分:1)
使用UTL_Match(https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS71219)匹配中的[oracle internal similiarity]中的一些...
这个逻辑更适用于匹配“相似”的名称或描述,以及语音拼写或拼写错误可能导致记录不匹配。
通过调整下面的.5,您可以看到百分比如何让您越来越接近完美匹配。
with cte as (
select 'Content of values' val from dual union all
select 'Values identity' val from dual union all
select 'triple combo' from dual union all
select 'my combo'from dual union all
select 'sub-zero combo'from dual)
select a.*, b.*, utl_match.edit_distance_similarity(a.val, b.val) c, UTL_MATCH.JARO_WINKLER(a.val,b.val) JW
from cte a
cross join cte b
where UTL_MATCH.JARO_WINKLER(a.val,b.val) > .5
order by utl_match.edit_distance_similarity(a.val, b.val) desc
和查询/输出的截图。
或者我们可以使用内连接和>如果我们只想要一种方式...
select a.*, b.*, utl_match.edit_distance_similarity(a.val, b.val) c, UTL_MATCH.JARO_WINKLER(a.val,b.val) JW
from cte a
inner join cte b
on A.Val > B.Val
where utl_match.jaro_winkler(a.val,b.val) > .5
order by utl_match.edit_distance_similarity(a.val, b.val) desc
这将返回3个所需记录。
But this does not explicitly check each any word matches.
这是您的基本要求。我只是想让你知道其他选择。