【问题标题】:How to Split the address string, House number and Street Name using SQL?如何使用 SQL 拆分地址字符串、门牌号和街道名称?
【发布时间】:2019-08-25 09:54:17
【问题描述】:

我正在尝试将门牌号和街道名称与地址分开。

我可以拆分大部分地址,直到找到包含数字和字母作为 HouseNumber 一部分的地址。

我在下面尝试过,它在大多数情况下都有效。但它不适用于像 876A Mountain Breeze Rd 这样的地址。我无法将门牌号 876A 与地址的其余部分分开。

他们有办法将876A拆分为[门牌号]吗?

SELECT
   C.CustomerID
   ,CASE
       WHEN ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', 
LTRIM(C.ServiceAddress)))) = 1 THEN
           LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', 
LTRIM(C.ServiceAddress)))
       ELSE
           NULL
   END AS [House Number]

 ,CASE
       WHEN ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', LTRIM(C.ServiceAddress)))) = 1 THEN
           LTRIM(RTRIM(SUBSTRING(
                                    LTRIM(C.ServiceAddress),
                                    CHARINDEX(' ', LTRIM(C.ServiceAddress)) + 1,
                                    LEN(LTRIM(C.ServiceAddress)))))
       ELSE
           LTRIM(RTRIM(C.ServiceAddress))
   END AS [Street Name]
 FROM dbo.Customers AS C

【问题讨论】:

  • 对于门牌号,它总是会是空格之前的第一个字符串吗?那么无论是数字还是字母,门牌号码是否只组合成1个字符串,然后其余的开头是空格?所以你可以把数据解析到第一个空格?
  • @Brad -- 是的,门牌号,无论是数字还是字母,都只组合成 1 个字符串,然后其余的开头是空格。像“26600 SW 146th Ct”这样的地址我的脚本工作正常。只有当它像“876A Mountain Breeze Rd”时,我的代码才不起作用。它无法拆分“876A”
  • ISNUMERIC, LTRIM, LEFT, CHARINDEX 都是数据库内置函数,而不是标准 SQL 的一部分,即它们是特定于数据库的。我猜是微软 SQL Server。我对么?在任何情况下,您都应该在问题中添加一个标签,表明您正在使用哪个 DBMS。
  • @Abra 是 Microsoft Sql Server
  • 这是一个非常复杂的问题。有一些 3rd 方包可以像 SSIS 的 Task Factory 一样。 sentryone.com/products/task-factory/feature/…

标签: sql sql-server tsql


【解决方案1】:

你能试试这个,看看它是否给你正确的结果?

SELECT
C.CustomerID
,CASE
   WHEN ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', 
LTRIM(C.ServiceAddress)))) = 1 OR ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' 
', 
LTRIM(C.ServiceAddress)))) = 0 THEN
       LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', 
LTRIM(C.ServiceAddress)))
   ELSE
       NULL
END AS [House Number]

,CASE
   WHEN ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' ', 
LTRIM(C.ServiceAddress)))) = 1 OR ISNUMERIC(LEFT(LTRIM(C.ServiceAddress), CHARINDEX(' 
', LTRIM(C.ServiceAddress)))) = 0 THEN
       LTRIM(RTRIM(SUBSTRING(
                                LTRIM(C.ServiceAddress),
                                CHARINDEX(' ', LTRIM(C.ServiceAddress)) + 1,
                                LEN(LTRIM(C.ServiceAddress)))))
   ELSE
       LTRIM(RTRIM(C.ServiceAddress))
 END AS [Street Name]
FROM dbo.Customers AS C

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多