取出一字符串中的数字.

huangjing81 2007-07-22 10:20:56
请问怎么样将一字符串中的数字给取出.
如:

as2.212af
daw2.12fa
dfd21dfas


得到

2.212
2.12
21

...全文
243 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
谁是谁的谁 2007-07-25
  • 打赏
  • 举报
回复
'%[^0-9.]%
这句怎么理解呢..
baggio785 2007-07-23
  • 打赏
  • 举报
回复
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
小数位一样长呢
比如
12.11mmmm5.23
我现在是取第一个
12.11
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
改下

alter function fn_num(
@str varchar(60)
)
returns varchar(60)
as
begin
declare @r varchar(60)
declare @t varchar(60)
set @t=''
while PATINDEX('%[0-9.]%',@str)>0
begin
set @str=stuff(@str,1,PATINDEX('%[0-9.]%',@str)-1,'')
if PATINDEX('%[^0-9.]%',@str)>0
begin
set @r=left(@str,PATINDEX('%[^0-9.]%',@str)-1)
set @str=stuff(@str,1,PATINDEX('%[^0-9.]%',@str)-1,'')
end
else
begin
set @r=@str
set @str=''
end
--判断小数位长度,决定取舍
if charindex('.',@r)>0
if charindex('.',@t)>0
begin
if len(stuff(@r,1,charindex('.',@r)-1,''))>len(stuff(@t,1,charindex('.',@t)-1,''))
set @t=@r

end
else
set @t=@r

end
return @t
end
go
huangjing81 2007-07-22
  • 打赏
  • 举报
回复
如果是 "sf3.456dadef34.32"
楼主要什么样的结果呢?
---------------------
需要的是小数位数最长的那个数
ORARichard 2007-07-22
  • 打赏
  • 举报
回复
如果是 "sf3.456dadef34.32"
楼主要什么样的结果呢?
simonhehe 2007-07-22
  • 打赏
  • 举报
回复
select dbo.fn_num('as2.212a2%aaa$2,200.55f')
simonhehe 2007-07-22
  • 打赏
  • 举报
回复
To: Haiwer(海阔天空) ( ) 信誉:138

select dbo.fn_num('as2.212a22f')
= 2.21222
echiynn 2007-07-22
  • 打赏
  • 举报
回复
哦,明白了,原來匹配字符不需要逗號來分隔,呵呵
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
空格也是
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
echiynn(寶琲) :你的PATINDEX不对,因为如果串中有,也会测出来

你测试下:
select PATINDEX('%[0-9, .]%','abc,de')
--结果
4


huangjing81 2007-07-22
  • 打赏
  • 举报
回复
这么快.

多谢多谢,周末愉快
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
如果这些串是表的字段,可以这样查询

select dbo.fn_num(字段名) as num from 表

echiynn 2007-07-22
  • 打赏
  • 举报
回复
create function fn_GetNum(@s varchar(8000))
returns varchar(8000)
as
begin
select @s = stuff(stuff(@s, 1, patindex('%[0-9, .]%', @s) - 1, ''),
patindex('%[^0-9, .]%', stuff(@s, 1, patindex('%[0-9, .]%', @s) - 1, '')),
len(@s), '')
return @s
end

declare @t table(s varchar(8000))

insert @t select 'as2.212af'
union all select 'daw2.12fa'
union all select 'dfd21dfas'

select dbo.fn_GetNum(s) as result from @t

/*
result
----------
2.212
2.12
21

(所影响的行数为 3 行)
*/
昵称被占用了 2007-07-22
  • 打赏
  • 举报
回复
写个函数取吧

create function fn_num(
@str varchar(60)
)
returns varchar(60)
as
begin
declare @r varchar(60)
set @r=''
while PATINDEX('%[0-9.]%',@str)>0
begin
set @str=stuff(@str,1,PATINDEX('%[0-9.]%',@str)-1,'')
if PATINDEX('%[^0-9.]%',@str)>0
begin
set @r=@r+left(@str,PATINDEX('%[^0-9.]%',@str)-1)
set @str=stuff(@str,1,PATINDEX('%[^0-9.]%',@str)-1,'')
end
else
begin
set @r=@r+@str
set @str=''
end
end
return @r
end
go

--调用
select dbo.fn_num('as2.212af')
--结果
2.212


huangjing81 2007-07-22
  • 打赏
  • 举报
回复
是的
gddd 2007-07-22
  • 打赏
  • 举报
回复
用SQL语言来做?
谁是谁的谁 2007-07-22
  • 打赏
  • 举报
回复
有意思,抢个SF坐着听...

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧