Voici une version qui extrait tous les chiffres d'une chaîne de caractères ; c'est-à-dire que, étant donné I'm 35 years old; I was born in 1982. The average family has 2.4 children.
ce qui donnerait 35198224
. c'est-à-dire qu'il est bon lorsque vous avez des données numériques qui peuvent avoir été formatées sous forme de code (par exemple, le code de l'utilisateur). #123,456,789
/ 123-00005
), mais elle n'est pas appropriée si vous cherchez à extraire des nombres spécifiques (par opposition aux chiffres / uniquement les caractères numériques) du texte. De plus, elle ne traite que les chiffres, et ne renvoie donc pas les signes négatifs ( -
) ou des périodes .
).
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
Ce code fonctionne en supprimant tous les chiffres (c'est-à-dire les caractères que nous voulons) d'une chaîne de caractères donnée en les remplaçant par des blancs. Ensuite, il parcourt la chaîne originale (qui comprend les chiffres) en supprimant tous les caractères restants (c'est-à-dire les caractères non numériques), ne laissant ainsi que les chiffres.
La raison pour laquelle nous procédons en deux étapes, plutôt que de supprimer tous les caractères non numériques en premier lieu, est qu'il n'y a que 10 chiffres, alors qu'il y a un très grand nombre de caractères possibles ; ainsi, remplacer cette petite liste est relativement rapide ; ensuite, cela nous donne une liste des caractères non numériques qui existent réellement dans la chaîne de caractères, de sorte que nous pouvons ensuite remplacer ce petit ensemble.
La méthode fait appel au SQL récursif, en utilisant des expressions de table communes (CTE).