如何将地址分成多个字段?

时间:2015-07-01 16:44:26

标签: mysql sql

我查看了这个网站,找不到正确的答案。

我有一个名为ADDRLINE1的字段,用于保存联系地址。地址就像这样输入到应用程序中。

 7710 Computer Ave.
 Ste. 103
 Edina, MN 55435

每行后都有一个回车符。有时会有一个#套件,有时候没有。

我需要将此地址分成不同的列。

   Addr1               Addr2         Addr3    City    State   ZipCode
7710 Computer Ave.    Ste. 103        NULL    Edina    MN      55435

我该怎么做?我已经看过几个例子,但没有一个是我正在寻找的。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这不是最干净,最有效的方式,而且我确信最有可能做得更好更好的方法,但这应该让你顺利,直到有人用更好的方式回答溶液:

DECLARE @tbl TABLE ( ADDRLINE1 VARCHAR(100) )
INSERT  INTO @tbl
    SELECT  '7710 Computer Ave' + CHAR(13) + CHAR(10) + 'Ste. 103' + CHAR(13) + CHAR(10) + 'suite #123' + CHAR(13) + CHAR(10) + 'Edina, MN 55435'
    UNION ALL
    SELECT  '7710 Computer Ave' + CHAR(13) + CHAR(10) + 'Ste. 103' + CHAR(13) + CHAR(10) + 'Edina, MN 55435'

SELECT  SUBSTRING([ADDRLINE1], 1, CHARINDEX(CHAR(13), [ADDRLINE1]) - 1) AS Addr1 ,
    SUBSTRING([ADDRLINE1], CHARINDEX(CHAR(13), [ADDRLINE1]) + 2, CHARINDEX(CHAR(13), REPLACE([ADDRLINE1], SUBSTRING([ADDRLINE1], 1, CHARINDEX(CHAR(13), [ADDRLINE1]) + 1), '')) - 1) AS Addr2 ,
    CASE WHEN (LEN([ADDRLINE1]) - LEN(REPLACE([ADDRLINE1],CHAR(13),''))) = 3
        THEN REVERSE(SUBSTRING(REVERSE(REPLACE([ADDRLINE1],REVERSE(SUBSTRING(REVERSE([ADDRLINE1]),1,CHARINDEX(CHAR(13),REVERSE([ADDRLINE1])))),'')),
                               1,
                               CHARINDEX(CHAR(13),REVERSE(REPLACE([ADDRLINE1],REVERSE(SUBSTRING(REVERSE([ADDRLINE1]),1,CHARINDEX(CHAR(13),REVERSE([ADDRLINE1])))),'')))-2)) ELSE NULL END AS Addr3 ,
    REVERSE(SUBSTRING(REVERSE([ADDRLINE1]), CHARINDEX(',', REVERSE([ADDRLINE1])) + 1, CHARINDEX(CHAR(10), REVERSE([ADDRLINE1])) - CHARINDEX(',', REVERSE([ADDRLINE1])) - 1)) AS City ,
    SUBSTRING([ADDRLINE1], CHARINDEX(',', [ADDRLINE1]) + 2, 2) AS [State] ,
    SUBSTRING([ADDRLINE1], CHARINDEX(',', [ADDRLINE1]) + 5, 5) AS ZipCode 
FROM    @tbl

输出:

Addr1               Addr2       Addr3       City    State   ZipCode
7710 Computer Ave   Ste. 103    suite #123  Edina   MN      55435
7710 Computer Ave   Ste. 103    NULL        Edina   MN      55435

注意:State和Zipcode列基于以下假设:值中唯一的逗号将位于City之后。如果这不是一个有效的假设,我可以进行一些编辑。