2015-10-14 117 views
1

我只想將包含街道號碼和街道名稱的地址列分成兩列:街道號碼和街道名稱。街道號碼和名稱在地址欄中按空格分隔。我使用下面的腳本將我給出的地址根據空格分隔符分成兩列。將列分成兩部分

select left(Address, CHARINDEX(' ', Address)) as Street_Number, 
     substring(Address, CHARINDEX(' ', Address)+1, len(Address)-(CHARINDEX(' ', Address)-1)) as Street_Name 
from [dbo].XYZ 

問題是在某些情況下我只有街道名稱的地址,在這種情況下,我希望街道號碼欄留空白\ null。

+0

我從一個單獨的表中獲取的地址欄,然後使用代碼分成街道編號和名稱列和存儲--clean了這兩列在不同的表中 –

回答

0

這是我如何處理它。我希望這將有所幫助。

創建數據庫TESTDB 去

使用TESTDB GO - 創建樣品表CustomerAddress 創建表CustomerAddress(地址CHAR(100)) 去

插入到CustomerAddress VALUES('123主街') 插入到CustomerAddress值('XYZ St') 插入到CustomerAddress值('abc')

select * from Custome rAddress

--option#1A - 複式地址列,當沒有街道號碼與空值代替 SELECT
Street_Number = CASE WHEN(ISNUMERIC(LEFT(地址,1))= 1)THEN LEFT(地址, CHARINDEX('',Address)) ELSE'' END, Street_Name = CASE WHEN(ISNUMERIC(LEFT(Address,1))= 1)THEN substring(Address,CHARINDEX('',Address)+ 1,len (地址) - (CHARINDEX('',地址) - 1)) ELSE地址 END FROM [dbo] .CustomerAddress;

--option#1B - 拆分地址列,當沒有街道號碼替換爲NULL SELECT
Street_Number = CASE WHEN(ISNUMERIC(LEFT(地址,1))= 1)THEN LEFT(地址,CHARINDEX( ',Address)) ELSE NULL END, Street_Name = CASE WHEN(ISNUMERIC(LEFT(Address,1))= 1)THEN substring(Address,CHARINDEX('',Address)+ 1,len(Address) - (CHARINDEX('',Address) - 1)) ELSE Address END FROM [dbo] .CustomerAddress;

--option#2A - 使用諸如%,而不是ISNUMERIC,我們可能會獲得更好的性能

選擇
Street_Number = CASE WHEN(地址LIKE '[0-9]%')然後離開(地址, CHARINDEX( ' '地址)) ELSE NULL END,

STREET_NAME = CASE WHEN(地址LIKE '[0-9]%')THEN SUBSTRING(地址,CHARINDEX('',地址)+ 1,LEN (地址) - (CHARINDEX('',地址) - 1)) ELSE地址 END FROM [dbo]。CustomerAddress;

通過刪除表 DROP TABLE [DBO] .CustomerAddress 去

+0

請查看如何在答案中設置您的代碼的格式,請參閱下面的答案以獲取示例。除此之外......歡迎! – SQLMason

2

方式一:

;with t(Address) as (
    select '123 street lane' union all 
    select '12a lane' union all 
    select 'street lane' union all 
    select 'street' 
) 
select 
    Address, 
    case when Address like '[0-9]%' then 
     left(Address, charindex(' ', Address) - 1) 
    else 
     '' 
    end as Street_Number, 
    case when Address like '[0-9]%' then 
     substring(Address, charindex(' ', Address) + 1, len(Address)) 
    else 
     Address 
    end as Street_Name 
from t 

>> 

Address   Street_Number Street_Name 
--------------- --------------- --------------- 
123 street lane 123    street lane 
12a lane  12a    lane 
street lane      street lane 
street       street