当前位置: 代码迷 >> Sql Server >> 怎的从无规律字符串中截取想要的数字
  详细解决方案

怎的从无规律字符串中截取想要的数字

热度:52   发布时间:2016-04-24 09:52:25.0
怎样从无规律字符串中截取想要的数字?
     数据库中存有无规律字段格式包含 “  __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 @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
DECLARE @STR VARCHAR(4000)
SET @STR='ASDAD9km+14m至1km+1111m'
SELECT * FROM TEST(@STR)

有个地方没考虑好
已修改如下
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('新路段')
结果:
  相关解决方案