Sql 比较表中的字符串值

Sql 比较表中的字符串值,sql,oracle,Sql,Oracle,有没有办法比较两个字符串列,并获得匹配项 我有两列包含姓名,一列是全名,另一列(大部分)只是姓氏 我刚刚用soundex试过,但是如果两列中的值几乎相同,它就会返回 SELECT * FROM TABLE WHERE soundex(FullName) = soundex(Surname) 有了soundex,它将只匹配第三行。据我所知,当匹配变得复杂时,没有什么现成的东西。然而,对于所示的情况,以下表达式就足够了: where fullname like '%' || surname 更新

有没有办法比较两个字符串列,并获得匹配项

我有两列包含姓名,一列是全名,另一列(大部分)只是姓氏

我刚刚用soundex试过,但是如果两列中的值几乎相同,它就会返回

SELECT * FROM TABLE
WHERE soundex(FullName) = soundex(Surname)

有了soundex,它将只匹配第三行。

据我所知,当匹配变得复杂时,没有什么现成的东西。然而,对于所示的情况,以下表达式就足够了:

where fullname like '%' || surname
更新 主要问题可能是误报:

  • 姓氏“帕克”出现在“彼得·帕克”中。上面的查询通过查看全名的结尾来解决这个问题
另一个问题可能是其他答案中提到的大写/小写(示例数据中未显示)

  • 你想要姓“帕克”和“彼得·帕克”匹配
但是,如果不加注意地看待strings案例,就会出现另一个问题:

  • 姓氏“斯特朗”将突然与“路易斯·阿姆斯特朗”匹配
解决此问题的方法是添加一个空格以产生差异:

where ' ' || upper(fullname) like '% ' || upper(surname)
  • “路易斯·阿姆斯特朗”类似于“%STRONG”
    ->false
  • “路易斯·阿姆斯特朗”类似于“%阿姆斯特朗”
    ->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);