选择子字符串

时间:2019-12-04 04:50:46

标签: sql sql-server substring

我在一个字段中有这样的数据:

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

我想在不同的列中输入建筑物编号和街道地址,如下所示

145 | Upper Heidelberg Road
 1  | Flintoff Street               

3 个答案:

答案 0 :(得分:1)

您可以在逻辑下尝试此操作-

  

考虑“级别”之后的第一个单词是建筑物编号。   建筑物编号后,直到下一个逗号(“,”)的字符串为街道地址

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
  

如果在建筑物编号后没有逗号(,)的可能性,则可以使用以下逻辑-

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

输出为-

Building_number Street_address
145             Upper Heidelberg Road
1               Flintoff Street

答案 1 :(得分:0)

使用CHARINDEX获取特定单词,然后使用Function`拆分字符串和数字。

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

功能

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;

输出

Building Number Street Name
145             Upper Heidelberg Road
1               Flintoff Street

答案 2 :(得分: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
相关问题