2012-07-04 23 views
9

dire che ho un paio di campi come il seguente:SQL prendere solo i valori numerici da un varchar

abd738927 
jaksm234234 
hfk342 
ndma0834 
jon99322 

Tipo: varchar.

Come faccio a prendere solo i valori numerici da questa alla visualizzazione:

738927 
234234 
342 
0834 
99322 

hanno cercato stringa tuttavia i dati variano in lunghezza, e gettati non ha funzionato sia a causa di non essere in grado di convertire, tutte le idee?

+0

Date un'occhiata a 'PATINDEX'. –

+0

Sì, patindex, assumendo che tutte le numeriche siano raggruppate insieme, come nel tuo esempio, altrimenti potresti aver bisogno di una funzione. – Sean

+0

Devi farlo in SQL o è consentita la manipolazione post-query? Se è così allora vorrei usare una regex per estrarre il numero per la visualizzazione; Ho fatto una ricerca rapida e non ho trovato nulla che dimostri che puoi usare un'espressione regolare tra SELECT e FROM. – Thevenin

risposta

10

Ecco l'esempio con PATINDEX:

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

Ciò presuppone (1) il campo avrà una numerica, (2) i valori numerici sono tutti raggruppati insieme, e (3) i numeri non hanno alcun carattere successivo dopo di loro.

+1

E, se il campo non ha numeri? – user990016

+0

@ user990016 quindi aggiungere una clausola 'where' per filtrare quei record o un'istruzione' case' per restituire un valore predefinito per tali record. Quindi: 'WHERE fieldName LIKE '% [0-9]%'' e 'CASE WHEN fieldName NOT LIKE '% [0-9]%' THEN 'DEFAULT_VALUE' ELSE SUBSTRING (fieldName, PATINDEX ('% [0-9] % ', fieldName), LEN (fieldName)) END' – Sean

2

Penso che tu voglia la funzione di VBA. Abbastanza facile da realizzare con 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

estratto solo i numeri (senza utilizzare ciclo while) e controllare ogni personaggio, per vedere se si tratta di un numero e estrarlo

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

Sto guardando il tuo esempio e dà una conversione in errore int se la colonna non contiene numeri. qualche idea? – user990016

3

Beh, se non si vuole creare una funzione, si può solo qualcosa di simile:

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, per favore non farlo ... – Nelson

+6

Questa soluzione perseguiterà i miei sogni per sempre. –

+0

davvero inquietante – dllhell

2

input table

se si dispone di dati come sopra nell'immagine, quindi utilizzare la query di seguito

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

risultati saranno simile a questa

Result table

Problemi correlati