将地址拆分为多列

时间:2017-07-26 21:39:38

标签: sql sql-server tsql

我有一个地址字段,其中所有地址详细信息都保存在一列中,我想创建一些标签,因此需要能够将地址拆分为正确的格式。 示例: -

 ADDRESS 
PIKE ROAD, AL 36064-3401
MEMPHIS TN 38104-5802 
JAMAICA PLAIN MA 02130-2337

需要将此列拆分为

    City      State     Zip
  PIKE ROAD    AL       36064-3401
 MEMPHIS        TN       38104-5802
JAMAICA PLAIN   MA       02130-2337

我可以使用

提取邮政编码
STUFF(Address, 1, Len(Address) +1- CHARINDEX(' ',Reverse(Address)), '') from abx

但我在提取城市和州方面遇到了麻烦。是否有可能根据单词的长度分割字符串,即单词(2)的长度前的所有字符进入City,所有带有2个字符的单词进入状态示例: - Pike Road进入城市并且AL(长度为2)处于状态?

3 个答案:

答案 0 :(得分:2)

这适用于这三个例子。正如@Kevin在上面指出的那样,如果您的数据一致,这是有效的,正如他所说,“这是一个非常大的问题。”

我所做的是创建一个模仿表格的子查询。它有一列“x”,只有一个字符串值。我向前工作以获得邮政编码(你想出来的),然后是州,然后是街道地址。用于提取基于前一个信息的每条信息的函数。

我多年没有使用过SQL Server,所以我使用了web app designed to mimick SQL Server 2014

此查询应该在下面的屏幕截图中生成表格:

enter image description here

select x
, REPLACE(SUBSTRING(x, 1, LEN(x) - CHARINDEX(' ', REVERSE(x), CHARINDEX(' ', REVERSE(x)) + 1)), ',', '') as city
, SUBSTRING(x, LEN(x) - CHARINDEX(' ', REVERSE(x), CHARINDEX(' ', REVERSE(x)) + 1) + 2, 2) as state
, SUBSTRING(x, LEN(x) + 2 - CHARINDEX(' ', REVERSE(x)), CHARINDEX(' ', REVERSE(x))) as zip

FROM (
select 'PIKE ROAD, AL 36064-3401' as x 
union
select 'MEMPHIS TN 38104-5802'
union
select 'JAMAICA PLAIN MA 02130-2337'
    ) as whatever

HTH!

干杯,

-Maashu

答案 1 :(得分:1)

你可以做这样的事情,如果你的数据是一致的,它会起作用。那是一个非常大的IF ...

DECLARE @ADDRESS NVARCHAR(255) = 'PIKE ROAD, AL 36064-3401'
DECLARE @DELIMITER CHAR(1) = ' '
DECLARE @POS INT
DECLARE @ZIP NVARCHAR(11)
DECLARE @STATE NVARCHAR(11)
DECLARE @CITY NVARCHAR(200)

-- get the occurrence of the last space
SET @POS = LEN(@ADDRESS) - CHARINDEX(@DELIMITER,REVERSE(@ADDRESS))

--set the zip code
SET @ZIP = SUBSTRING(@ADDRESS, @POS+2, 11)

--get the remaining portion of the address
SET @ADDRESS = SUBSTRING(@ADDRESS, 0, @POS+1)

--set the last space again
SET @POS =  LEN(@ADDRESS) - CHARINDEX(@DELIMITER,REVERSE(@ADDRESS))

--set the state and street
SET @STATE = SUBSTRING(@ADDRESS, @POS+2, 11)
SET @CITY = SUBSTRING(@ADDRESS, 0, @POS)

PRINT @ZIP
PRINT @STATE
PRINT @CITY

输出:

36064-3401
AL
PIKE ROAD

答案 2 :(得分:0)

正如@Habo所说,您只需要使用LENSUBSTRING

WITH Tbl AS(
    SELECT * FROM (VALUES       
        ('PIKE ROAD, AL 36064-3401'),
        ('MEMPHIS TN 38104-5802'),
        ('JAMAICA PLAIN MA 02130-2337')
    ) t(Address)
)
SELECT
    City    = SUBSTRING(Address, 0, LEN(Address) - 13),
    State   = SUBSTRING(Address, LEN(Address) - 12, 2),
    ZipCode = SUBSTRING(Address, LEN(Address) - 9, 10)
FROM Tbl