近日写SQL脚本时,碰到这样的问题,需要从字符串中将数字部分解析出来。这本身并不是一个很复杂的问题,但如何使用简短的SQL语句实现还是需要研究一番的。

最容易想到的方法,就是将字符串按位从头到尾检查一遍,碰到数字部分就记录下来,这种方式原理非常简单,我之前曾经写过一篇按照这种逻辑解析字符串的文章《对字符串另类解析实现复杂功能》,有兴趣的朋友可以参阅一下,我这里就不再赘述了。
今天我们另辟蹊径,直接使用SQL Server内置函数来实现,这里用到的函数主要包括patindex和stuff两个,我们先来看看两个函数的含义。
PATINDEX:通过模式匹配查找位置
patindex返回模式在指定表达式中第一次出现的起始位置,如果在所有有效的文本和字符数据类型中都找不到该模式,则返回零。
patindex的语法格式为:
PATINDEX('%pattern%' ,expression)
pattern参数就是包含要查找的序列的字符表达式。可以使用通配符,但pattern之前和之后必须有%字符(搜索第一个或最后一个字符时除外)。pattern最多包含8000个字符。
expression是一个字符串表达式,通常是针对指定模式搜索的列。
返回类型:一般为 int。
STUFF:将字符串插入到另一个字符串中
stuff函数实现将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符,然后将第二个字符串插入到第一个字符串的开始位置。
stuff的语法格式为:
STUFF(expression1 , start , length , expression2)
expression1和expression2均为字符数据的表达式。可以是常量、变量,也可以是字符列或二进制数据列。expression1为待被插入的字符串,expression2为插入字符串。如果expression2为'',则执行效果就等于是直接按照后续参数设定删除了。
start是一个整数值,指定删除和插入的开始位置。
length是一个整数,指定要删除的字符数。
了解了两个函数的含义,我们就可以开始工作了。
综合运用实现从字符串中解析出数字
先上脚本:
declare @data nvarchar(max)=N'现在是2019年03月08日';while patindex('%[^0-9]%',@data)>0 begin set @data=stuff(@data,patindex('%[^0-9]%',@data),1,'');end print @data;
脚本中使用了while循环,循环中止条件为不存在数字,patindex('%[^0-9]%',@data)这里使用了模式匹配^0-9的含义为非数字意思。循环体中的stuff函数,将非数字部分替换为空字符串,等于匹配到的非数字部分被清除掉了。
结果可参考下图:
从上图可以看出,解析出来的刚好就是字符串中包含的数字部分。脚本稍微改造一下,可作为一个自定义函数,那您在调用的时候就简单多了。
希望对您有所帮助!