2012-07-04 35 views
9

decir que tengo un par de campos como la siguiente:SQL tomar sólo los valores numéricos de una varchar

abd738927 
jaksm234234 
hfk342 
ndma0834 
jon99322 

Tipo: varchar.

¿Cómo se toma sólo los valores numéricos de esta para mostrar:

738927 
234234 
342 
0834 
99322 

han tratado subcadena sin embargo los datos varían en longitud, y arrojados tampoco funcionaba bien debido a no poder convertir, alguna idea?

+0

Tome un vistazo a 'PATINDEX'. –

+0

Sí, patindex, suponiendo que todos los números están agrupados, como en su ejemplo, de lo contrario podría necesitar una función. – Sean

+0

¿Tiene que hacer esto en SQL o se permite la manipulación posterior a la consulta? Si es así, usaría una expresión regular para extraer el número para mostrar; Hice una búsqueda superficial y no encontré nada que muestre que puede usar una expresión regular entre SELECT y FROM. – Thevenin

Respuesta

10

Aquí está el ejemplo, con PATINDEX:

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

Esto supone (1) el campo tendrá un valor numérico, (2) los valores numéricos están agrupados juntos, y (3) los numéricos no tienen caracteres posteriores después de ellos.

+1

Y, ¿y si el campo no tiene números? – user990016

+0

@ user990016 luego agregue una cláusula 'where' para filtrar esos registros, o una instrucción' case' para devolver un valor predeterminado para esos registros. Entonces: 'WHERE fieldName LIKE '% [0-9]%'' y 'CASE WHEN fieldName NOT LIKE '% [0-9]%' THEN 'DEFAULT_VALUE' ELSE SUBSTRING (fieldName, PATINDEX ('% [0-9] % ', fieldName), LEN (fieldName)) END' – Sean

2

Creo que estás queriendo la función Val() de VBA. Es bastante fácil de lograr 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

extraer sólo números (sin utilizar el bucle while) y comprobar todos y cada personaje para ver si se trata de un número y extraerlo

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

Estoy viendo su ejemplo y da una conversión a error int si la columna no contiene ningún número. ¿Alguna idea? – user990016

3

Bueno, si usted no quiere crear una función, puede simplemente algo como esto:

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, por favor no hagas esto ... – Nelson

+6

Esta solución perseguirá mis sueños para siempre. –

+0

inquietante de hecho – dllhell

2

input table

si tiene datos como más arriba en la imagen, a continuación, utilizar la siguiente consulta

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

Los resultados se vería así

Result table

Cuestiones relacionadas