代码之家  ›  专栏  ›  技术社区  ›  user254875486 TM Creative

我需要帮助拆分地址(数字、加法等)

  •  3
  • user254875486 TM Creative  · 技术社区  · 14 年前

    我的问题是这个;我有一个SQL Server表,其中包含大约100000条记录。每个人都有一个地址,比如“Nieuwe Prinsengracht 12-III”。客户现在希望将街道与数字和加法分开(因此每个地址变成两个或三个字段)。问题是,我们不能确定当前地址的格式,它也可以是类似“Velperweg30”的东西。

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

    一个可能的解决方案是使用regex来实现这一点,但是我更愿意使用查询来实现这一点。有没有办法在查询中使用正则表达式?或者你对如何解决这样的问题有什么其他的建议吗?

    7 回复  |  直到 14 年前
        1
  •  3
  •   dave    14 年前

    像这样的可能?

    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\u addition]字段将以数字开头。

        2
  •  4
  •   marc_s    14 年前

    SQL Server和T-SQL在处理能力上相当有限—如果您真的对繁重的工作和正则表达式等非常认真,那么最好的办法可能是在C#或VB.NET中创建一个程序集来处理所有棘手的正则表达式业务,然后将其部署到SQL-CLR中并使用T-SQL中的函数。

    “纯”T-SQL除了子字符串和CHARINDEX之外,实际上不能处理太多的字符串操作,但仅此而已。

        3
  •  1
  •   Tim Rogers    14 年前

    在回答“有没有在查询中使用regex的方法?”时,答案是肯定的,但它需要一点.NET知识。创建一个具有用户定义函数的CLR程序集,该函数执行regex工作。VisualStudio2008对此有一个模板项目。将其部署到SQL server并从查询中调用它。

        4
  •  1
  •   TGnat    14 年前

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

    我假设你为他们的主要业务工作的人不是地址解析。我的建议是买一个解决方案,而不是自己构建一个。

    我熟悉 this company

    除了他们产品的使用者之外,我与他们没有任何关系。

        5
  •  0
  •   Philip Kelley    14 年前

    这听起来像是一个常见的“获取一段复杂的文本,它可以看起来像任何东西,并使它看起来像我们现在希望它看起来像什么”的问题。仅使用T-SQL(它没有本机regex功能)往往很难做到这一点。为了解决这个问题,您可能需要使用数据库之外的复杂代码。

        6
  •  0
  •   Gilbert Le Blanc    14 年前

    我以前遇到过这个问题。

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

    熟悉你地址的打字员很快就会手工修改10万个地址。当然,如果客户想把钱花在定制软件或打字员身上,那就看他了。

        7
  •  0
  •   Erik Vullings    10 年前

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

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

    注意事项:

    • 一些地址包含一个-,例如Willem Alexanderlaan或a'