网站首页 > 技术文章 正文
近日写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函数,将非数字部分替换为空字符串,等于匹配到的非数字部分被清除掉了。
结果可参考下图:
从上图可以看出,解析出来的刚好就是字符串中包含的数字部分。脚本稍微改造一下,可作为一个自定义函数,那您在调用的时候就简单多了。
希望对您有所帮助!
猜你喜欢
- 2024-09-14 Mysql:替换某个字段中的部分字符串——replace函数
- 2024-09-14 plsql字符串分割浅谈(plsql字符串截取)
- 2024-09-14 oracle函数--INSTR、SUBSTR使用说明和实例讲解
- 2024-09-14 详解Oracle使用substr和instr截取字符串指定位置的字符
- 2024-09-14 mysql 替换某一个字段中的字符串(mysql替换一个字符串的字符函数为)
- 2024-09-14 sql注入总结(sql注入示例)
- 2024-09-14 Mybatis 中的 DAO 接口和 XML 文件里的 SQL他们如何建立关系?
- 2024-09-14 SQL Server - 字符串常用操作(sqlserver 字符类型)
- 2024-09-14 如何在Java中比较字符串?(如何在java中比较字符串个数)
- 2024-09-14 SQL截取函数(substr)与字符串查找函数(Instr)的组合应用
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 480℃启用MySQL查询缓存(mysql8.0查询缓存)
- 460℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 440℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)