将列拆分为两个

时间:2015-10-14 15:13:41

标签: sql sql-server

我只想将包含街道号码和街道名称的地址栏拆分为两列:街道号码和街道名称。街道号和名称由地址栏中的空格分隔。我使用以下脚本根据空格分隔符将我提供的地址拆分为2列。

std::multimap<int, Bar >::iterator it = foo.begin();

问题是在某些情况下,我只有街道名称的地址,在这种情况下,我希望街道号列留空\ null。

2 个答案:

答案 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 去