0

I have got data like this in a field:

"Shop 7 Ground Level 145 Upper Heidelberg Road, IVANHOE"
"Shop 1 Ground Level 1 Flintoff Street, GREENSBOROUGH"  

And I want to have Building Number and Street address in different columns, like below

145 | Upper Heidelberg Road
 1  | Flintoff Street               
Selaka Nanayakkara
  • 3,296
  • 1
  • 22
  • 42
MHI
  • 37
  • 4

3 Answers3

1

You can try this below logic-

Consider the first word after "Level " is building number. After building number, string till next comma(",") is street address

WITH your_table(address)
AS
(
    SELECT 'Shop 7 Ground Level 145 Upper Heidelberg Road, IVANHOE' UNION ALL
    SELECT 'Shop 1 Ground Level 1 Flintoff Street, GREENSBOROUGH'
)

SELECT 
LEFT(
    RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
    CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
) Building_number,
LEFT(
    RIGHT(
        RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
        LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
    ),
    CHARINDEX(
        ',',
        RIGHT(
            RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
            LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
        )
        ,
        0
    )-1
) Street_address
FROM your_table

In case if there are possibilities of not having a Comma(,) after the building number, You can use this following logic-

SELECT 
LEFT(
    RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
    CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
) Building_number,

LEFT(
    RIGHT(
        RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
        LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
    ),
    IIF(            
        CHARINDEX
        (
            ',',
            RIGHT(
                RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
                LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
            )
            ,
            0
        ) = 0 , 
        LEN(
            RIGHT(
                RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
                LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
            )
        )
        ,
        CHARINDEX
        (
            ',',
            RIGHT(
                RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),
                LEN(RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5))-CHARINDEX(' ',RIGHT(address,LEN(address)-CHARINDEX('Level',address,0)-5),0)
            )
            ,
            0
        )-1
    )           
) Street_address
FROM your_table

Output is-

Building_number Street_address
145             Upper Heidelberg Road
1               Flintoff Street
mkRabbani
  • 16,295
  • 2
  • 15
  • 24
0

Use CHARINDEX to get the specific word and after use Function` to split the string and number.

DB FIDDLE

SELECT dbo.GetNumericValue('145 Upper Heidelberg Road') [Building Number], REPLACE('145 Upper Heidelberg Road',dbo.GetNumericValue('145 Upper Heidelberg Road'),'') [Street Name] 
FROM
(
   SELECT SUBSTRING(Data, CHARINDEX('Ground Level', Data) + LEN('Ground Level') + 1, CHARINDEX(', ',Data) - (CHARINDEX('Ground Level', Data) + 1 + LEN('Ground Level'))) Address
   FROM TAB
)X

Function

CREATE FUNCTION dbo.GetNumericValue  (@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS  
BEGIN  
    DECLARE @intAlpha INT  
    SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)  
    BEGIN  
        WHILE @intAlpha > 0  
        BEGIN  
            SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )  
            SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )  
        END  
    END  
    RETURN ISNULL(@strAlphaNumeric,0)  
END;

Output

Building Number Street Name
145             Upper Heidelberg Road
1               Flintoff Street
Vignesh Kumar A
  • 27,863
  • 13
  • 63
  • 115
0
declare @str varchar(250)
declare @start int
declare @end int
declare @subStr varchar(250)
declare @buildingNumber varchar(50)
declare @street varchar(150)

set @str = ('Shop 1 Ground Level 1 Flintoff Street, GREENSBOROUGH')

set @start = (ChARINDEX('Level', @str)) + 5
set @end = (ChARINDEX(',', @str))

set @subStr = SUBSTRING(@str, @start, (@end - @start)) 
set @subStr = LTRIM(@subStr)
set @subStr = RTRIM(@subStr)

--select @subStr

set @buildingNumber = SUBSTRING(@subStr, (ChARINDEX(' ', @subStr))-1, (ChARINDEX(' ', @subStr))) 

---If you want to have space between buidling number and street address comment following two lines
set @buildingNumber = LTRIM(@buildingNumber)
set @buildingNumber = RTRIM(@buildingNumber)

--select @buildingNumber

set @street = SUBSTRING(@subStr, (ChARINDEX(' ', @subStr)), (Len(@subStr))) 

---If you want to have space between buidling number and street address comment following two lines
set @street = LTRIM(@street)
set @street = RTRIM(@street)

--select @street

select @buildingNumber + '|' + @street
MHI
  • 37
  • 4