如何在 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 中将街道值拆分为原子?的主要内容,如果未能解决你的问题,请参考以下文章