2017-07-26 143 views
0

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

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)的长度在城市之前的所有字符,并且所有具有2个字符的单词都是状态示例: - 派克路进入城市并且AL(长度是2)在状态?

+0

是每一行'City',两个字符的'State'和10字符'ZIPplus'?你是否需要/想要将多个空白字符压缩到一个空格?如果是这样,复制现有表达式以获取状态似乎很容易。在此之前的任何事情都是城市。 (你甚至不需要'CharIndex'。) – HABO

+0

是的格式是城市,两个字符的状态和10个字符的邮编 –

+1

只需使用'Len'和'SubString'。最后10个是ZIPplus。再跳过三个字符,并以两个字符作为状态。城市是'莱恩' - 14. – HABO

回答

1

正如@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 
+0

谢谢!那工作 –

+2

你的数据更好一致! – Kevin

+0

同意。如果他能修好桌面设计,那么这样做会好得多。 –

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 

OUTPUT:

36064-3401 
AL 
PIKE ROAD 
+0

通过一致的我注意到第一个记录在城市之后有一个逗号,所有拉链zip + 4等都相应地修改了代码。 – Kevin

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