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中同一列的先前值进行比较
如何对oracle sql中的数字字符串进行数学比较[重复]