高分求助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 行)
*/