在CSDN上看到的帖子,查找字符串'asdf123sdf34asfjk234'中的数字。
这是某位高人的回复。下面是我加的注释,可能会更好理解一点。
用到的几个函数的意思:
patindex: 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
语法
PATINDEX ( '%pattern%' , expression )
参数
pattern
一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式。
expression
一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。
STUFF: 删除指定长度的字符并在指定的起始点插入另一组字符。
语法
STUFF ( character_expression , start , length , character_expression )
参数
character_expression
由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。
start
是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。
length
是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。
ISNUMERIC:确定表达式是否为一个有效的数字类型。
语法
ISNUMERIC ( expression )
参数
expression
要计算的表达式
SUBSTRING:返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效 Microsoft® SQL Server™ 数据类型的更多信息,请参见数据类型。
语法
SUBSTRING ( expression , start , length )
参数
expression
是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start
是一个整数,指定子串的开始位置。
length
是一个整数,指定子串的长度(要返回的字符数或字节数)。
--------------------------------------------
declare @str varchar(100),@tmp varchar(101),@i int
--@str 测试字符串,@tmp 中间缓存,@i增量
set @str='asdf123sdf34asfjk234'
set @tmp=@str+'a'
while patindex('%[0-9]%',@tmp)>0--在@tmp中如果有数字,则进行下面的循环
begin
set @i=1
while 1=1
begin
if isnumeric(substring(@tmp,patindex('%[0-9]%',@tmp)+@i,1))=0 break--如果数字下一位不是数字,跳出循环
set @i=@i+1
end
print substring(@tmp,patindex('%[0-9]%',@tmp),@i)--输出数字
set @tmp=stuff(@tmp,patindex('%[0-9]%',@tmp),@i,'')--将原字符串中已经提出的字符替换为空
end
-----------------------------------------------------------------------------
下面是我去掉了一些东西,有点不明白@tmp=@str+'a'的意思。感觉没有什么必要
declare @str varchar(100),@i int,@tmp varchar(20),@a int
--@str 测试字符串,@tmp 中间缓存,@i增量
set @str='asdd'
if patindex('%[0-9]%',@str)=0--如果没有数字则跳出
begin
goto:aa
end
set @tmp=''
while patindex('%[0-9]%',@str)>0--在@tmp中如果有数字,则进行下面的循环
begin
set @i=1
while 1=1
begin
if isnumeric(substring(@str,patindex('%[0-9]%',@str)+@i,1))=0 break--如果数字下一位不是数字,跳出循环
set @i=@i+1
end
set @tmp=@tmp+substring(@str,patindex('%[0-9]%',@str),@i)+',' --把提取的数字写入@tmp
set @str=stuff(@str,patindex('%[0-9]%',@str),@i,'')--将原字符串中已经提出的字符替换为空
end
select left(@tmp,len(@tmp)-1)
aa:
print '字符串中没有数字'