Reputation: 19
I just want to split an address column containing both street number and street name into two columns:Street number and Street name. The street number and name are separated by space in the address column. I used the following script to split the address I give into 2 columns based on the space delimiter.
select left(Address, CHARINDEX(' ', Address)) as Street_Number,
substring(Address, CHARINDEX(' ', Address)+1, len(Address)-(CHARINDEX(' ', Address)-1)) as Street_Name
from [dbo].XYZ
The issue is in some cases I have addresses only with street name and in this case I want the street number column left blank\null.
Upvotes: 1
Views: 96
Reputation: 19
This is how I addressed it. I hope this will help.
Create Database TestDB go
USE TestDB GO --Create Sample Table CustomerAddress create table CustomerAddress(Address char(100)) go
insert into CustomerAddress values('123 Main St') insert into CustomerAddress values('XYZ St') insert into CustomerAddress values(' abc')
select * from CustomerAddress
--Option #1a - Split Address column, when no street number replace with empty value
SELECT
Street_Number =
CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN LEFT(Address, CHARINDEX(' ', Address))
ELSE ''
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 #1b - Split Address column, when no street number replace with NULL
SELECT
Street_Number =
CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN LEFT(Address, 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 - Use LIKE % instead of ISNUMERIC, we may get better performance
SELECT
Street_Number = CASE WHEN (Address LIKE '[0-9]%') THEN LEFT(Address, CHARINDEX(' ', Address))
ELSE NULL
END ,
Street_Name = CASE WHEN (Address LIKE '[0-9]%') THEN substring(Address, CHARINDEX(' ', Address) + 1, len(Address) - (CHARINDEX(' ', Address) - 1)) ELSE Address END FROM [dbo].CustomerAddress;
--Clean up by dropping the table drop table [dbo].CustomerAddress go
Upvotes: 0
Reputation: 175956
One way:
;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
Upvotes: 2