【发布时间】: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