SQL提取含单位数字:正则与字符串函数结合解析实例
你可以使用正则表达式以及一些字符串函数来提取SQLServer中包含计量单位的数字。
通过正则表达式和字符串函数提取SQLServer中包含测量单位的数字下面是一个示例。假设有一个字符串列string_col,其中包含数字和计量单位,例如“20米”,“10厘米”,“5.5公里”等,我们可以使用以下查询语句将其提取出来:首先,使用`PATINDEXfunction()`查找包含数字的子字符串的开头,然后使用`SUBSTRING()`函数提取数字字符串。
接下来,找到子字符串后的第一个非数字字符以确定数字结束的位置。
最后,使用“CAST()”函数将数字字符串转换为浮点数,然后使用“SUBSTRING()”函数提取字符串的度量单位。
该查询语句的原理是基于计量单位始终位于数字之后的假设。
如果数字和计量单位之间存在其他字符,查询结果可能不准确。
另外,如果查询中包含不同类型的计量单位,处理逻辑也必须作相应修改。
PL/SQL提取某个字段第一个出现的数字。例如从'商501啊啊'中提取出'5',要求提取出的值为int型。
在SQL语句中如何用正则取出一个字符串的前几位数字
SQL使用字符串的前几位,SQL关键字“substring”。
有关使用“substring”的信息,请参阅以下SQL:
declare@Tnvarchar(10)
set@T='12345abcde'
selectsubstring(@T,1,5)
结果如下:12345
在SQL中编写正则表达式时,只能使用存储过程来处理
像这样的SQL:
CREATEFUNCTIONdbo.(5000),-需要匹配的源字符串@regexpvarchar(1000),-正则表达式@ignorecasebit=0-是否区分大小写,默认值为“false”)RETURNSbit-返回结果0-false,1-trueASBEGIN--0(成功),或非零数字(错误),它是OLE值返回的HRESULT的整数-自动化对象。
DECLARE@hrinteger-用于存储返回的对象标记,以便对该对象进行后续操作。
DECLARE@objRegExpintegerDECLARE@objMatchesinteger–保存结果。
DECLARE@resultsbit/*创建只能由系统管理员固定服务器角色的成员运行的OLE对象实例sp_OACreate,
并确保计算机上存在VBScript.RegExp类库给出*/EXEC@hr=sp_OACreate'VBScript.RegExp',@objRegExpOUTPUTIF@hr<>0BEGINSET@results=0RETURN@resultsEND/*以下三个旨在设置新对象的三个属性。
以下是VBScript.RegExp中常用的属性示例:DimregEx、Match、Matches、CreateVariables。
SetregEx=NewRegExp'创建通用表达式。
regEx.Pattern=patrn'设置模式。
regEx.IgnoreCase=True'指定是否区分大小写。
regEx.Global=True"设置全局可用性。
"setMatches=regEx.Execute(string)'重复匹配集RegExpTest=regEx.Execute(strng)'执行搜索。
foreachmatchinmatches'重复匹配集RetStr=RetStr&"Matchfoundatposition"RetStr=RetStr&Match.FirstIndex&".MatchValueis'"RetStr=RetStr&Match.Value&"'."&vbCRLFNextRegExpTest=RetStr*/EXEC@hr=sp_OASetProperty@objRegExp,'模式',@regexpIF@hr<>0BEGINSET@results=0RETURN@resultsENDEXEC@hr=sp_OASetProperty@objRegExp,'全局',falseIF@hr<>0BEGINSET@results=0RETURN@resultsENDEXEC@hr=sp_OASetProperty@objRegExp,'IgnoreCase',@ignorecaseIF@hr<>0BEGINSSET@results=0RETURN@resultsEND--调用对象方法EXEC@hr=sp_OAMethod@objRegExp,'Test',@resultsOUTPUT,@sourceIF@hr<>0BEGINSET@results=0RETURN@resultsEND-释放创建的OLE对象。
EXEC@hr=sp_OADestroy@objRegExpIF@hr<>0BEGINSET@results=0RETURN@resultsENDRETURN@resultsEND