正如您所提到的,如果您只期待[a-zA-z()/+],您可以使用translate 函数,该函数可从2017+ 获得
declare @table TABLE (str varchar(max))
insert into @table
select '+49123/4567890(estnumber)'
select replace(translate(str, '/+()abcdefghijklmnopqrstuvwxyz', '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'), '~', '') digits
from @table
对于未知字符的更复杂场景,您可以尝试在字符串列上使用递归 CTE 以仅提取数字,如以下查询。
;with cte
as (
select v.txt originalstring
,v.txt
,convert(varchar(max), '') as digits
,1 as lev
from (
values ('+49123/4567890(testnumber)')
,('+234&*#$%!@#')
) v(txt)
union all
select originalstring
,stuff(txt, 1, 1, '')
,(
case
when left(txt, 1) LIKE '[0-9]'
then digits + left(txt, 1)
else digits
end
)
,lev + 1
from cte
where txt > ''
)
select originalstring
,digits
from (
select c.originalstring
,c.digits
,row_number() over (partition by c.originalstring order by lev desc
) rn
from cte c
) t
where rn = 1
输出
originalstring digits
--------------- --------
+234&*#$%!@# 234
+49123/4567890(testnumber) 491234567890