Sql 比较表中的字符串值
有没有办法比较两个字符串列,并获得匹配项 我有两列包含姓名,一列是全名,另一列(大部分)只是姓氏 我刚刚用soundex试过,但是如果两列中的值几乎相同,它就会返回Sql 比较表中的字符串值,sql,oracle,Sql,Oracle,有没有办法比较两个字符串列,并获得匹配项 我有两列包含姓名,一列是全名,另一列(大部分)只是姓氏 我刚刚用soundex试过,但是如果两列中的值几乎相同,它就会返回 SELECT * FROM TABLE WHERE soundex(FullName) = soundex(Surname) 有了soundex,它将只匹配第三行。据我所知,当匹配变得复杂时,没有什么现成的东西。然而,对于所示的情况,以下表达式就足够了: where fullname like '%' || surname 更新
SELECT * FROM TABLE
WHERE soundex(FullName) = soundex(Surname)
有了soundex,它将只匹配第三行。据我所知,当匹配变得复杂时,没有什么现成的东西。然而,对于所示的情况,以下表达式就足够了:
where fullname like '%' || surname
更新
主要问题可能是误报:
- 姓氏“帕克”出现在“彼得·帕克”中。上面的查询通过查看全名的结尾来解决这个问题
- 你想要姓“帕克”和“彼得·帕克”匹配
- 姓氏“斯特朗”将突然与“路易斯·阿姆斯特朗”匹配
where ' ' || upper(fullname) like '% ' || upper(surname)
->false“路易斯·阿姆斯特朗”类似于“%STRONG”
->true“路易斯·阿姆斯特朗”类似于“%阿姆斯特朗”
->true“路易斯·阿姆斯特朗”类似于“%路易斯·阿姆斯特朗”
演示:一个简单的选项是使用
instr
,它显示全名中是否存在姓氏
:
SQL> with test (id, fullname, surname) as
2 (select 1, 'John Doe' , 'Doe' from dual union all
3 select 2, 'Peter Parker' , 'Parker' from dual union all
4 select 3, 'Brian Griffin', 'Brian Griffin' from dual
5 )
6 select *
7 from test
8 where instr(fullname, surname) > 0;
ID FULLNAME SURNAME
---------- ------------- -------------
1 John Doe Doe
2 Peter Parker Parker
3 Brian Griffin Brian Griffin
另一种选择是使用UTL\u MATCH
函数之一,例如Jaro Winkler相似度,它显示这些字符串的匹配程度:
请随意探索软件包提供的其他功能
另外,请注意,我没有注意可能的字母大小写差异(例如“DOE”与“DOE”)。如果您也需要,请将upper(姓氏)
与upper(全名)
进行比较,请使用instring功能
SELECT * FROM TABLE
WHERE instr(Surname, FullName) > 0;
SELECT * FROM TABLE
WHERE instr(upper(Surname), upper(FullName)) > 0;
SELECT * FROM TABLE
WHERE upper(FullName) > upper(Surname);
SOUNDEX()
是一个过时的函数,在本世纪没有很好的用途。非常感谢,这似乎对我也很有用:)(我通过增加大小写敏感度上限得到了更多结果)如果您认为它正确,请标记为正确,以便其他人会有所帮助。我已经为您提供了实现它的其他方法最后一个查询没有多大意义<代码>'JOHN SMITH'>'ABE LINCOLN'
,因为'J'>'A'
,所以它是匹配的???至于其他查询:INSTR('JOHN','MARC JOHNSSON'
)=6`,那么这也是一个匹配?它不是一个匹配,INSTR
中的位置,因此我还添加了带有切换参数的表达式。这里是一个演示,用六个而不是三个表达式;它们都不可靠:谢谢,这也是获得匹配的一种非常聪明的方法谢谢:-)因为被接受的答案是错误的,但其他两个答案中提到的区分大小写有其意义,我已经更新了我的答案,以允许大小写不匹配。非常感谢,这似乎对我非常有效:)(正如您提到的,我通过将其添加到我的选择中,确实获得了更多的结果)
SQL> with test (id, fullname, surname) as
2 (select 1, 'John Doe' , 'Doe' from dual union all
3 select 2, 'Peter Parker' , 'Parker' from dual union all
4 select 3, 'Brian Griffin', 'Brian Griffin' from dual
5 )
6 select id, fullname, surname,
7 utl_match.jaro_winkler_similarity(fullname, surname) jws
8 from test
9 order by id;
ID FULLNAME SURNAME JWS
---------- ------------- ------------- ----------
1 John Doe Doe 48
2 Peter Parker Parker 62
3 Brian Griffin Brian Griffin 100
SQL>
SELECT * FROM TABLE
WHERE instr(Surname, FullName) > 0;
SELECT * FROM TABLE
WHERE instr(upper(Surname), upper(FullName)) > 0;
SELECT * FROM TABLE
WHERE upper(FullName) > upper(Surname);