2012-07-04 3 views
9

sadece sayısal değerler alan i aşağıdaki gibi birkaç alanları olduğunu varsayalım:SQL bir varchar

abd738927 
jaksm234234 
hfk342 
ndma0834 
jon99322 

Tür: varchar.

nasıl ekrana bu sadece sayısal değerler alan yok:

738927 
234234 
342 
0834 
99322 

alt dizeyi ancak veri uzunluğu değişir denediniz, ve ya dolayı, herhangi bir fikir attı olmasının hiç bir çalışma döküm?

+0

gibi bakmak aşağıda sorgu

select field_3 from table where PATINDEX('%[ ~'[email protected]#$%^&*_()=+\|{};",<>/?a-z]%', field_3)=0 

Sonuçları edilecektir kullanın. –

+0

Yep, patindex, tüm sayısal öğelerin örnekte olduğu gibi birlikte gruplandığını varsayarak, başka bir işleve ihtiyacınız olabilir. – Sean

+0

Bunu SQL'de mi yapmalı yoksa sorgulama sonrası manipülasyona izin veriliyor mu? Öyleyse, o zaman gösterim için sayıyı çıkarmak için bir regex kullanırdım; Seçkin bir araştırma yaptım ve SELECT ve FROM arasında düzenli bir ifade kullanabileceğinizi gösteren hiçbir şeye rastlamadım. – Thevenin

cevap

10

ile başarmak kolay yeterli Burada PATINDEX ile örnek:

select SUBSTRING(fieldName, PATINDEX('%[0-9]%', fieldName), LEN(fieldName)) 

Bu (1) alanı ((2) Rakamsal hepsinin bir arada tutulması, bir sayısal var ve OLACAK varsayar 3) sayısalların ondan sonra gelen karakterleri yoktur.

+1

Ve, ya alanın numarası yoksa? – user990016

+0

@ user990016 daha sonra bu kayıtları filtrelemek için bir 'where' cümlesi veya bu kayıtlar için bir varsayılan değer döndürmek için bir 'case' ifadesi ekleyin. Yani: '' NEREDEN alanıAdı '% [0-9]%' 've' 'DAHA FAZLA DEĞİL alanAdı '% [0-9]%' SONRA 'DEFAULT_VALUE' ELSE SUBSTRING (fieldName, PATINDEX ('% [0-9] % ', fieldName), LEN (fieldName)) END' – Sean

2

VBA'nın Val() işlevini istediğinizi düşünüyorum. 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
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 
2

Özü (döngü sırasında kullanmadan) yalnızca sayılar ve bir numara olup olmadığını görmek ve istemediğiniz Eh eğer

Declare @s varchar(100),@result varchar(100) 
    set @s='as4khd0939sdf78' 
    set @result='' 

    select 
     @[email protected]+ 
       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 
1
select substring(
       'jaksm234234', 
       patindex('%[0-9]%','jaksm234234'), 
       LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2 
       ) 
+0

Örneğinize bakıyorum ve sütun herhangi bir sayı içermiyorsa int hatasına bir dönüşüm veriyor. Düşüncesi olan var mı? – user990016

3

ayıklamak için her karakter kontrol böyle bir işlev oluşturmak yapabilirsiniz bir şey:

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) 
+11

OMG, lütfen bunu yapmayın ... – Nelson

+6

Bu çözüm sonsuza dek hayallerime uğrayacak. –

+0

gerçekten rahatsız edici – dllhell