我只想将包含街道号码和街道名称的地址栏拆分为两列:街道号码和街道名称。街道号和名称由地址栏中的空格分隔。我使用以下脚本根据空格分隔符将我提供的地址拆分为2列。
std::multimap<int, Bar >::iterator it = foo.begin();
问题是在某些情况下,我只有街道名称的地址,在这种情况下,我希望街道号列留空\ null。
答案 0 :(得分: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
答案 1 :(得分:0)
这就是我解决它的方式。我希望这将有所帮助。
创建数据库TestDB 去
USE TestDB 走 - 创建样本表CustomerAddress create table CustomerAddress(Address char(100)) 去
插入CustomerAddress值(&#39; 123 Main St&#39;) 插入CustomerAddress值(&#39; XYZ St&#39;) 插入CustomerAddress值(&#39; abc&#39;)
从CustomerAddress
中选择* - 选项#1a - 拆分地址列,当没有街道号替换为空值时
SELECT
Street_Number =
情况(ISNUMERIC(左(地址,1))= 1)然后左(地址,CHARINDEX(&#39;&#39;,地址))
ELSE&#39;&#39;
结束 ,
Street_Name =
情况下(ISNUMERIC(左(地址,1))= 1)那么子串(地址,CHARINDEX(&#39;&#39;,地址)+ 1,len(地址) - (CHARINDEX(&#39;&#) 39;,地址) - 1))
ELSE地址
结束
FROM [dbo] .CustomerAddress;
- 选项#1b - 拆分地址列,当没有街道号替换为NULL时
SELECT
Street_Number =
情况(ISNUMERIC(左(地址,1))= 1)然后左(地址,CHARINDEX(&#39;&#39;,地址))
ELSE NULL
结束 ,
Street_Name =
情况下(ISNUMERIC(左(地址,1))= 1)那么子串(地址,CHARINDEX(&#39;&#39;,地址)+ 1,len(地址) - (CHARINDEX(&#39;&#) 39;,地址) - 1))
ELSE地址
结束
FROM [dbo] .CustomerAddress;
- 选项#2a - 使用LIKE%代替ISNUMERIC,我们可能会获得更好的性能
选择
Street_Number = CASE WHEN(地址LIKE&#39; [0-9]%&#39;)然后左(地址,CHARINDEX(&#39;&#39;,地址))
ELSE NULL
结束,
Street_Name = CASE WHEN(地址LIKE&#39; [0-9]%&#39;)那么子字符串(地址,CHARINDEX(&#39;&#39;,地址)+ 1,len(地址) - (CHARINDEX(&#39;&#39;,地址) - 1)) ELSE地址 结束 FROM [dbo] .CustomerAddress;
- 放下桌子清理 drop table [dbo] .CustomerAddress 去