我需要帮助分割地址(数量,添加等)

时间:2010-07-21 15:23:49

标签: sql-server string

为模糊标题道歉...

我的问题是这个;我有一个SQL Server表人员约有100.000条记录。每个人都有一个地址,如“Nieuwe Prinsengracht 12 - III”。客户现在想要将街道与编号和添加分开(因此每个地址变为两个或三个字段)。问题是我们无法确定当前地址的格式,它也可能只是“Velperweg 30”。

我们唯一知道的是它是一段文本,后跟一个数字,可能后跟一些更多的文本(可以包含一个数字)。

一个可能的解决方案是使用正则表达式执行此操作,但我会(很多,很多)使用查询来执行此操作。有没有办法在查询中使用正则表达式?或者你有任何其他建议如何解决这个问题?

7 个答案:

答案 0 :(得分:4)

SQL Server和T-SQL的处理能力相当有限 - 如果你真的认真对待繁重的工作和正则表达式等,你最好的选择是用C#或VB.NET创建一个程序集。所有棘手的Regex业务,然后将其部署到SQL-CLR中并使用T-SQL中的函数。

“Pure”T-SQL无法真正处理超出SUBSTRING和CHARINDEX的字符串操作 - 但这就是它。

答案 1 :(得分:3)

这样的事可能吗?

SELECT
   substring([address_field], 1, patindex('%[1-9]%', [address_field])-1) as [STREET],
   substring([address_field], patindex('%[1-9]%', [address_field]), len([address_field])) as [NUMBER_ADDITON]
FROM
   [table]

它依赖于[street]字段不包含任何数字的假设,[number_addition]字段将以数字开头。

答案 2 :(得分:1)

回答你的“在查询中有没有办法使用正则表达式?”,然后是的,但它需要一些.NET知识。使用用户定义的函数创建一个CLR程序集,使您的正则表达式工作。 Visual Studio 2008有一个模板项目。将其部署到SQL服务器并从查询中调用它。

答案 3 :(得分:1)

名称和地址解析和标准化可能是我们作为程序员遇到的最困难的问题之一,正是因为你提到的原因。

我认为无论你为他们的主要业务工作的人都不是地址解析。我的建议是购买解决方案,而不是建立自己的解决方案。

我熟悉this company。您的地址示例似乎不是美国或加拿大,因此我不知道他们的产品是否有用,但他们可能会将您指向其他供应商。

除了他们产品的使用者之外,我不以任何方式与他们有任何联系。

答案 4 :(得分:0)

这听起来像是常见的“把一块复杂的文字看起来像任何东西,让它看起来像我们现在想要的样子”问题。仅使用T-SQL(没有本机正则表达式功能)这些往往很难做到。您可能必须使用数据库之外的复杂代码来解决此问题。

答案 5 :(得分:0)

TGnat是正确的。地址标准化很复杂。

之前我遇到过这个问题。

如果您的客户不想使用自定义软件,请开发一个简单的GUI,允许用户获取地址并手动拆分。您将删除旧格式的地址行,并插入具有新地址格式的行。

熟悉您的地址的打字员手动进行100,000次更改不会花费很长时间。当然,如果他想把钱花在定制软件或打字员身上,那取决于客户。

但你也不应该被数据清理费用困住。

答案 6 :(得分:0)

我意识到这是一个老问题,但为了将来参考,我仍然决定使用正则表达式添加答案(也是我自己也不会忘记)。今天,我在Excel中遇到了类似的问题,我不得不在街道和门牌号码中拆分地址。最后,我将列复制到SublimeText(共享软件文本编辑器),并使用正则表达式完成工作(CTRL-H,启用正则表达式):

FIND: ^('?\d?\d?\d?['-\.a-zA-Z ]*)(\d*).*$
REPLACE FOR THE HOUSE NUMBER: $2
REPLACE FOR THE STREET NAME:  $1

一些注意事项:

  • 某些地址以引号开头,例如霍特,所以我需要添加'?
  • 某些地址在开头包含数字,例如9月17日或2e Molendwarsstraat,所以我添加了\ d?\ d?\ d?
  • 某些地址包含 - ,例如Willem-Alexanderlaan或'