Oracle SQL 列比较

Posted

技术标签:

【中文标题】Oracle SQL 列比较【英文标题】:Oracle SQL column comparison 【发布时间】:2022-01-09 08:07:25 【问题描述】:

我有两列,我想比较一下它们是否相等,问题是当相同的关键字以不同的方式编写时。

例如,如果 column_1 = 123 Maryland Ave 和 column_2 = 123 Maryland Avenue,这两列应该相等,我想在查询中创建第三列以显示它们是否相等,谢谢您的帮助!

Column_1                   Column_2                  Equal?
-----------------------------------------------------------
 123 Maryland Ave           123 Maryland Avenue       Yes
 456 Maryland Ave           123 Maryland Ave          No

【问题讨论】:

SoundEx 是 littlefoot 响应的另一种选择。或者您可以同时使用两者并为两者设置一个阈值。但我以前用过这个,没关系。在我看来,最好的选择是对两个列使用 USPS 邮件地址验证/规范化系统的 API,然后进行比较。 请描述规则以将某些值视为相等。示例不是规则,如果不事先执行一些学习算法,计算机就无法理解示例。您没有明确提及列是否包含美国地址,那么很难提供任何通用的方法来解决问题。 ***.com/q/47529018/1509264 或 ***.com/q/38154986/1509264 的可能重复 【参考方案1】:

一种选择是检查这些值之间的相似性

SQL> with test (id, col1, col2) as
  2    (select 1, '123 Maryland Ave', '123 Maryland Avenue' from dual union all
  3     select 2, '456 Maryland Ave', '123 Maryland Ave'    from dual
  4    )
  5  select id, col1, col2,
  6    utl_match.jaro_winkler_similarity(col1, col2) as sim
  7  from test;

        ID COL1             COL2                       SIM
---------- ---------------- ------------------- ----------
         1 123 Maryland Ave 123 Maryland Avenue         96
         2 456 Maryland Ave 123 Maryland Ave            87

SQL>

现在,您必须确定满足您需求的阈值。是90%吗?让我们假设它是。然后你会使用CASE 表达式:

SQL> with test (id, col1, col2) as
  2    (select 1, '123 Maryland Ave', '123 Maryland Avenue' from dual union all
  3     select 2, '456 Maryland Ave', '123 Maryland Ave'    from dual
  4    )
  5  select id, col1, col2,
  6    case when utl_match.jaro_winkler_similarity(col1, col2) > 90 then 'Yes'
  7         else 'No'
  8    end as equal
  9  from test;

        ID COL1             COL2                EQUAL
---------- ---------------- ------------------- -------
         1 123 Maryland Ave 123 Maryland Avenue Yes
         2 456 Maryland Ave 123 Maryland Ave    No

SQL>

【讨论】:

非常感谢,这很有效,帮助很大!我有一个简单的问题。我有两个地址:123 East Johnson Street, Apt A ----- 和----- 123 E Johnson StAptB。这两个应该是相同的,但百分比返回低于 90% 的准确度。是否可以搜索诸如 Street 之类的单词并将其视为 St,也不计算在内。在 python 中,这些似乎更容易一些。再次感谢您! 您可以使用 REPLACE 并执行例如replace(address, 'street', 'st') 然后比较这些值。注意字母大小写!

以上是关于Oracle SQL 列比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将列的当前值与sql server和Oracle中同一列的先前值进行比较

比较 SQL 中的 Oracle 表列

如何对oracle sql中的数字字符串进行数学比较[重复]

在SQL语句中怎样对varchar型别的列进行数值大小的比较

在oracle sql中比较当前行和上一行

在Oracle-sql中比较两张表并更新一张表