将列分成两部分
我只想将包含街道号码和街道名称的地址列分成两列:街道号码和街道名称。街道号码和名称在地址栏中按空格分隔。我使用下面的脚本将我给出的地址根据空格分隔符分成两列。将列分成两部分
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。
这是我如何处理它。我希望这将有所帮助。
创建数据库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 去
请查看如何在答案中设置您的代码的格式,请参阅下面的答案以获取示例。除此之外......欢迎! – SQLMason
方式一:
;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
我从一个单独的表中获取的地址栏,然后使用代码分成街道编号和名称列和存储--clean了这两列在不同的表中 –