2015-10-14 119 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