日期:2014-05-18  浏览次数:20560 次

高分求助SQL语句,分都拿出来了
本人数据库有一字段,(例如叫abc)
里面的数据为(电视机   23   台)之类的
请教一个办法将这个字符串的数字取出来
其中中间的空格可能不只一个,前面的字符也不定长
数字都是连一起的
请高手指教

------解决方案--------------------
写个函数,逐个字符判断是否为数字,如果是数字,开始保存到字符串变量中,直接后续字符不是数字结束,转换为数值后返回。
------解决方案--------------------
create function dbo.regexReplace
(
@source varchar(5000), --原字符串
@regexp varchar(1000), --正则表达式
@replace varchar(1000), --替换值
@globalReplace bit = 0, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returnS varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @result varchar(5000)

exec @hr = sp_OACreate 'VBScript.RegExp ', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern ', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global ', @globalReplace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase ', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OAMethod @objRegExp, 'Replace ', @result OUTPUT, @source, @replace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end

return @result
end
GO


--调用
declare @str varchar(100)
set @str= 'xyz123z5 '
select dbo.regexReplace(@str, '[^0-9] ', ' ',1,1)
------解决方案--------------------
--假设最多有五个空格,如果更多,自己把when语句增加.

if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(content varchar(50))
insert into tb(content) values( '电视机 23 台 ')
insert into tb(content) values( '电视机 23 台 ')
insert into tb(content) values( '电视机 23 台 ')
insert into tb(content) values( '电视机 23 台 ')
insert into tb(content) values( '电视机 23 台 ')
go

select substring(content , charindex( ' ',content) , charindex( ' ',content , charindex( ' ',content) + 1) - charindex( ' ',content)) content from
(
select
case when charindex( ' ' , content) > 0 then replace(content , ' ' , ' ')
when charindex( ' ' , content) > 0 then replace(content , ' ' , ' ')
when charindex( ' ' , content) > 0 then replace(content , ' ' , ' ')
when charindex( ' ' , content) > 0 then replace(content , ' ' , ' ')
when charindex( ' ' , content) > 0 then content
end content
from tb
) t

drop table tb

/*
content
-------
23
23
23
23
23

(所影响的行数为 5 行)
*/