Вот версия, которая извлекает все цифры из строки; то есть, учитывая I'm 35 years old; I was born in 1982. The average family has 2.4 children.
, это вернет 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') --outputs: 12345613
,('1 some other string 98 example 4') --outputs: 1984
,('AB ABCDE # 123') --outputs: 123
,('ABCDE# 123') --outputs: 123
,('AB: ABC# 123') --outputs: 123
; with NonNumerics as (
select id
, data original
--the below line replaces all digits with blanks
, replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(data,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','') nonNumeric
from @table
)
--each iteration of the below CTE removes another non-numeric character from the original string, putting the result into the numerics column
, 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
)
--we select only those strings with `charsRemaining=0`; i.e. the rows for which all non-numeric characters have been removed; there should be 1 row returned for every 1 row in the original data set.
select * from Numerics where charsRemaining = 0
Этот код работает, удаляя все цифры (то есть символы, которые мы хотим) из заданных строк, заменяя их пробелами. Затем он проходит через исходную строку (которая включает в себя цифры), удаляя все оставшиеся символы (т. е. нечисловые символы), оставляя, таким образом, только цифры.
Причина, по которой мы делаем это в 2 шага, а не просто удаляем все нечисловые символы, заключается в том, что цифр всего 10, а возможных символов огромное количество; поэтому замена этого небольшого списка выполняется относительно быстро; затем дает нам список тех нечисловых символов, которые действительно существуют в строке, поэтому мы можем затем заменить этот небольшой набор.
Метод использует рекурсивный SQL с использованием общих табличных выражений (CTE).
person
JohnLBevan
schedule
15.08.2017