我在一个字段中有这样的数据:
"Shop 7 Ground Level 145 Upper Heidelberg Road, IVANHOE"
"Shop 1 Ground Level 1 Flintoff Street, GREENSBOROUGH"
我想在不同的列中输入建筑物编号和街道地址,如下所示
145 | Upper Heidelberg Road
1 | Flintoff Street
答案 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`拆分字符串和数字。
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