如何在 pl/sql 中将街道值拆分为原子?

Posted

技术标签:

【中文标题】如何在 pl/sql 中将街道值拆分为原子?【英文标题】:how do I split the street values into atomic in pl/sql? 【发布时间】:2013-05-12 14:06:48 【问题描述】:

我的任务是将非原子(澳大利亚)街道地址转换为原子,这意味着当前街道数据将作为街道编号和街道名称一起存储。示例是:

24 George street        -----------> 24         |   George street    
55 park rd              -----------> 55         |   pard rd  
102a gordon road        -----------> 102a       |   gordon road
unit 5/46 addison ave   -----------> unit 5/46  |   addison ave 
flat 2-9/87 north avenue-----------> flat 2-9/87|   north avenue
suit 5 lvl2/55 prince hwy-------> suit 5 lvl2/55|   prince hwy
shop 5 Big Shopping Centre  ------> Rejected
Suit 2 Level 100          -------> Rejected

添加的数据(程序应该工作的方式):

Darling street ------------------> Rejected
City road -----------------------> rejected

建议的代码处理结果:

Darling street ------------>   Darling     |    Street
City road   --------------->   City        |     road

实际上在这种情况下代码不应该处理地址并抛出异常。

分割地址的最佳方法是什么?

【问题讨论】:

为什么要拒​​绝:'shop 5 Big Shopping Centre'? @kaᵠ- 因为它不是一个有效的澳大利亚地址,邮局将根据任务的规范退回/拒绝送货 我明白了,但程序实际上并不理解数据,你需要以某种方式教他们。什么会导致被拒绝? 这是一个模糊的数据匹配要求,不能简单地用SQL单独解决。我们使用像 QAS (qas-experian.com.au) 这样的第三方工具取得了一定的成功,我相信还有其他类似的工具。 如何处理歧义,例如:24 George Pt(意思是George Point)当城市是Pt。麦格理。所以一个地址字符串,例如:24 George Pt Macquarie NSW?是 George Point 还是 Port Macquarie? 【参考方案1】:

我假设你已经看到了这个question 的答案。

@kaᵠ 已经指出程序对数据一无所知,因此它没有上下文。情况将永远如此。因此,考虑到这一点,您需要确定的第一件事是您需要什么级别的准确度?如果您需要 70% 的准确率,那么您可以使用简单的 REGEX 来做到这一点。 (正则表达式真的很简单吗)?

如果您需要确定从输入中提取的地址实际上是真实有效的,则需要一个列表或表格进行比较。该数据将来自澳大利亚邮政(或美国的 USPS)等来源。

因此,请使用您的正则表达式提取“猜测”,然后根据主列表验证这些,并且匹配的那些是好的。如果没有主列表,您就无法确定自己做对了还是做错了。

我实际上一直在 SmartyStreets 研究同样的问题(除了我只处理美国地址)并提出了许多不同的解决方案 - 确定地址字符串的开头和结尾的不同方法,以及以及如何处理误报或看起来像邮政编码的主要数字。您可以使用纯正则表达式,也可以使用包含邮政编码、州和街道名称的表格。这使您能够非常接近地以高精度提取原子数据。

【讨论】:

【参考方案2】:
select
   addr,
   regexp_substr(addr, '^(.*?)\s\D+$', 1, 1, '', 1) street_number,
   regexp_substr(addr, '^.*?\s+(\D*?)\s*$', 1, 1, '', 1) street_name
from t1   
where -- don't show rejected
   regexp_like(addr, '\d.*\s(street|road|rd|ave|avenue|hwy)\s*$', 'i')  

fiddle

【讨论】:

它运作良好,但如果街道数据中根本没有数字怎么办。我现在将街道名称作为街道号码,以防没有记录街道号码,如果没有号码,有没有办法阻止它处理? @DilshatAbduwalli - 请将您正在谈论的地址添加到您的问题中并提供所需的输出。 @Skritunoff - 根据上面的评论编辑了问题 @DilshatAbduwalli - 已修复。 @Skritunoff- 能否请您告诉我在固定版本中进行了哪些更改,因为正则表达式初学者很难区分差异,请

以上是关于如何在 pl/sql 中将街道值拆分为原子?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 中将一纳秒添加到时间戳

如何在第一个数字之后拆分街道地址?

如何在 PL/SQL CURSOR 中将参数作为输入?

将行拆分为多行 PL/SQL

如何在 Postgres 中将一个类型拆分为多个列?

PL/SQL - 如何在 IN 子句中使用数组