2016-12-15 118 views
1

基本上我試圖把地址欄作爲一列,並將其分成三列,第一列有地址號,第二列有街道名,第三列有一個恰當#或批號SQL將一列分爲三列

Address 
------------------- 
990 A street Apt 1B 
127 B street Lot 3 

到目前爲止,我有這這適用於數量和街道。

Select LEFT(MP.[ADDRESS],PATINDEX('%[0-9][^0-9]%', MP.[ADDRESS])) AS Number, 
     LTRIM(RIGHT(MP.[ADDRESS], LEN(MP.[ADDRESS]) - PATINDEX('%[0-9][^0-9]%', MP.[ADDRESS]))) As Street 
From MPFILE mp 

和它最終是這樣的:

Number | Street 
---------------------------- 
990  | A street Apt 1B 
127  | B Street Lot 3 

試圖讓這個雖然:

Number | Street | Apt/Lot 
----------------------------------- 
990  | A street | Apt 1B 
127  | B street | Lot 3 
+0

是它總是在街上以下APT或批號? – scsimon

+4

地址整改相當複雜,這就是爲什麼它有專用軟件的原因。 –

+0

如果實際街道名稱中包含多個單詞,則您的街道和公寓的計算將會很困難。例如,'123 Martin Luther King Blvd 23-B' – Joe

回答

2

像這樣將與您的數據。例如給定的工作,但戈登說地址很難解析,可能不應該在SQL中解析。

WITH locations AS 
(
    SELECT ADDRESS, 
      LEN(ADDRESS) AS Len, 
      PATINDEX('%[0-9][^0-9]%', ADDRESS) AS NumLoc, 
      PATINDEX('%APT%', ADDRESS) AS APTLoc, 
      PATINDEX('%Lot%', ADDRESS) AS LotLoc 
    FROM MPFILE 
), numbers AS 
(
    ADDRESS, 
    NumLoc, 
    Len - NumLoc AS StartAddr, 
    CASE WHEN APTLoc > 0 THEN AptLoc 
     WHEN LotLoc > 0 THEN LotLoc 
     ELSE Len AS EndAddr, 
    CASE WHEN APTLoc > 0 THEN AptLoc 
     WHEN LotLoc > 0 THEN LotLoc 
     ELSE Len AS StartApt, 
    Len AS EndApt 
) 
Select LEFT(NumLoc, MP.ADDRESS)) AS Number, 
     SUBSTRING(MP.ADDRESS, StartAddr, EndAddr), 
     SUBSTRING(MP.ADDRESS, StartApt, EndApt) 
From numbers 
0
Declare @t table (Address varchar(200)); 

Insert Into @t (Address) values 
    ('990 A street Apt 1B'), 
    ('127 B street Lot 3'), 
    ('127 B street Lot 345'), 
    ('4444 Rice Street Suite 105'), 
    ('715 South King Street #200'), 
    ('101 Aupuni Street Room 342') 

Select Left(Address,CHARINDEX(' ',Address)) as Number, 
     SUBSTRING(Address,CHARINDEX(' ',Address)+1, CHARINDEX('street',SUBSTRING(Address,CHARINDEX(' ',Address)+1,LEN(Address)))+LEN('street')) as Street 
     ,Substring(Address,CHARINDEX('street',Address)+LEN('street'),LEN(Address)) as [Apt/Lot] 
From @t 

** **結果

Number |Street    |Apt/Lot 
----------------------------|------- 
990  |A street   |Apt 1B 
127  |B street   |Lot 3 
127  |B street   |Lot 345 
4444 |Rice Street  |Suite 105 
715  |South King Street |#200 
101  |Aupuni Street  |Room 342