web-dev-qa-db-fra.com

SQL ne prend que les valeurs numériques d'un varchar

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?

11
JsonStatham

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.

15
Sean

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) 
4
fuhry
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
3
user1499112

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
2
Chris Gessler

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 
2
compcobalt

tableau d'entrée

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

Tableau des résultats

2
Muhammad saqib
select substring(
                'jaksm234234',
                patindex('%[0-9]%','jaksm234234'),
                LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
                )
1
general exception