这里是一个从字符串中提取所有数字的版本; 即,对于给定的
我今年35岁; 我出生于1982年。 平均每个家庭有2.4个孩子。
,这将返回
35198224
。即,它适用于您具有可能已格式化为代码的数字数据(例如
#123,456,789
/
123-00005
),但如果您希望从文本中提取特定数字(而不是仅仅是数字/数字字符),则不适用。此外,它只处理数字; 因此不会返回负号(
-
)或句点
。
)。
declare @table table (id bigint not null identity (1,1), data nvarchar(max))
insert @table (data)
values ('hello 123 its 45613 then')
,('1 some other string 98 example 4')
,('AB ABCDE # 123')
,('ABCDE# 123')
,('AB: ABC# 123')
; with NonNumerics as (
select id
, data original
, replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(data,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','') nonNumeric
from @table
)
, Numerics as (
select id
, replace(original, substring(nonNumeric,1,1), '') numerics
, replace(nonNumeric, substring(nonNumeric,1,1), '') charsToreplace
, len(replace(nonNumeric, substring(nonNumeric,1,1), '')) charsRemaining
from NonNumerics
union all
select id
, replace(numerics, substring(charsToreplace,1,1), '') numerics
, replace(charsToreplace, substring(charsToreplace,1,1), '') charsToreplace
, len(replace(charsToreplace, substring(charsToreplace,1,1), '')) charsRemaining
from Numerics
where charsRemaining > 0
)
select * from Numerics where charsRemaining = 0
此代码通过将给定字符串中的所有数字(即我们想要的字符)替换为空格来删除它们。然后,它会遍历原始字符串(其中包括数字),并删除剩下的所有字符(即非数字字符),从而仅保留数字。
我们之所以要这样做是因为只有10个数字,而可能的字符数量很大;因此替换该小列表相对较快;然后我们得到了那些实际存在于字符串中的非数字字符列表,所以我们可以替换这个小集合。
该方法利用递归SQL,使用公共表达式(CTE)。