数据库中存有无规律字段格式包含 “ __km+__m至__km+__m ”,比如为”新路段3线6km+500m至13km+300m间线路“ ,如何能将其中"km+"之前的数字和’ km+ ‘之后紧邻数字分别取出,(比如此例中'km+'前字段取出后应为6和13,之后字段为500和300),有什么办法能达到这种筛选效果呢?
------解决思路----------------------
有个地方没考虑好
已修改如下
CREATE FUNCTION TEST(@STR NVARCHAR(4000))
RETURNS @T TABLE(A VARCHAR(10))
AS
BEGIN
DECLARE @INDEX1 INT
SET @INDEX1=PATINDEX('%[^0-9][0-9]%',@STR)+1
DECLARE @INDEX2 INT
SET @INDEX2=CHARINDEX('km+',@STR)
DECLARE @CHECK NVARCHAR(4000)
SET @CHECK=SUBSTRING(@STR,@INDEX1,@INDEX2-@INDEX1)
WHILE PATINDEX('%[^0-9][0-9]%',@CHECK)>0
BEGIN
SET @INDEX1=@INDEX1+PATINDEX('%[^0-9][0-9]%',@CHECK)
SET @CHECK=SUBSTRING(@STR,@INDEX1,@INDEX2-@INDEX1)
END
DECLARE @INDEX3 INT
SET @INDEX3=CHARINDEX('m',@STR,@INDEX2+3)
DECLARE @INDEX4 INT
SET @INDEX4=CHARINDEX('km+',@STR,@INDEX3+2)
DECLARE @INDEX5 INT
SET @INDEX5=CHARINDEX('m',@STR,@INDEX4+3)
INSERT INTO @T
SELECT SUBSTRING(@STR,@INDEX1,@INDEX2-@INDEX1) UNION ALL
SELECT SUBSTRING(@STR,@INDEX2+3,@INDEX3-@INDEX2-3) UNION ALL
SELECT SUBSTRING(@STR,@INDEX3+2,@INDEX4-@INDEX3-2) UNION ALL
SELECT SUBSTRING(@STR,@INDEX4+3,@INDEX5-@INDEX4-3)
RETURN
END
GO
------解决思路----------------------
create function getNumberList(@inputstr varchar(100))
returns varchar(100)
begin
declare @reStr varchar(100)
declare @iLen int
declare @i int;
declare @tempStr varchar(10)
set @i=0;
set @reStr='';
set @tempStr='';
set @iLen=LEN(@inputstr);
set @inputstr=replace(REPLACE(@inputstr,'+',''),'-','')
while @i<=@iLen
begin
if ISNUMERIC(substring(@inputstr,@i,1))>0
begin
set @tempStr=@tempStr+substring(@inputstr,@i,1);
end
else
begin
if @tempStr<>''
begin
set @reStr=@reStr+','+@tempStr;
set @tempStr='';
end
end
set @i=@i+1;
end
if @reStr<>'' set @reStr=STUFF(@reStr,1,1,'');
return @reStr;
end
select dbo.getNumberList('新路段3线6km+500m至13km+300m间线路')
结果:3,6,500,13,300
select dbo.getNumberList('新路段')
结果: