Disons que j'ai quelques champs comme celui-ci:
abd738927
jaksm234234
hfk342
ndma0834
jon99322
Type: varchar.
Comment puis-je prendre juste les valeurs numériques de ceci pour afficher:
738927
234234
342
0834
99322
Avez-vous essayé la sous-chaîne mais les données varient en longueur, et la fonte n'a pas fonctionné, car elle est incapable de convertir, des idées?
Voici l'exemple avec PATINDEX:
select SUBSTRING(fieldName, PATINDEX('%[0-9]%', fieldName), LEN(fieldName))
Cela suppose (1) que le champ aura un chiffre, (2) les chiffres sont tous regroupés et (3) les caractères ne sont suivis d'aucun caractère.
Eh bien, si vous ne voulez pas créer une fonction, vous pouvez juste quelque chose comme ça
cast(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(YOUR_COLUMN
,'A',''),'B',''),'C',''),'D',''),'E',''),'F',''),'G',''),'H',''),'I',''),'J','')
,'K',''),'L',''),'M',''),'N',''),'O',''),'P',''),'Q',''),'R',''),'S',''),'T','')
,'U',''),'V',''),'W',''),'X',''),'Y',''),'Z',''),'$',''),',',''),' ','') as float)
DECLARE @NonNumeric varchar(1000) = 'RGI000Testing1000'
DECLARE @Index int
SET @Index = 0
while 1=1
begin
set @Index = patindex('%[^0-9]%',@NonNumeric)
if @Index <> 0
begin
SET @NonNumeric = replace(@NonNumeric,substring(@NonNumeric,@Index, 1), '')
end
else
break;
end
select @NonNumeric -- 0001000
Je pense que vous voulez la fonction Val()
de VBA. Assez facile à accomplir avec IsNumeric()
create function Val
(
@text nvarchar(40)
)
returns float
as begin
-- emulate vba's val() function
declare @result float
declare @tmp varchar(40)
set @tmp = @text
while isnumeric(@tmp) = 0 and len(@tmp)>0 begin
set @tmp=left(@tmp,len(@tmp)-1)
end
set @result = cast(@tmp as float)
return @result
end
N'extrayez que des nombres (sans utiliser la boucle while) et vérifiez chaque caractère pour voir s'il s'agit d'un nombre
Declare @s varchar(100),@result varchar(100)
set @s='as4khd0939sdf78'
set @result=''
select
@result=@result+
case when number like '[0-9]' then number else '' end from
(
select substring(@s,number,1) as number from
(
select number from master..spt_values
where type='p' and number between 1 and len(@s)
) as t
) as t
select @result as only_numbers
si vous avez des données comme ci-dessus dans l'image, utilisez la requête ci-dessous
select field_3 from table where PATINDEX('%[ ~`!@#$%^&*_()=+\|{};",<>/?a-z]%', field_3)=0
Les résultats seront comme ceci
select substring(
'jaksm234234',
patindex('%[0-9]%','jaksm234234'),
LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
)