una separar longitud length hasta extraer datos charindex caracteres caracter campo cadena buscar tsql numerical-methods

tsql - separar - sql substring hasta un caracter



Comprueba si un varchar es un nĂºmero(TSQL) (9)

¿Hay alguna manera fácil de averiguar si un varchar es un número?

Ejemplos:

abc123 -> sin número

123 -> sí, es un número

Gracias :)


Al usar SQL Server 2012+, puede usar las funciones TRY_ * si tiene necesidades específicas. Por ejemplo,

-- will fail for decimal values, but allow negative values TRY_CAST(@value AS INT) IS NOT NULL -- will fail for non-positive integers; can be used with other examples below as well, or reversed if only negative desired TRY_CAST(@value AS INT) > 0 -- will fail if a $ is used, but allow decimals to the specified precision TRY_CAST(@value AS DECIMAL(10,2)) IS NOT NULL -- will allow valid currency TRY_CAST(@value AS MONEY) IS NOT NULL -- will allow scientific notation to be used like 1.7E+3 TRY_CAST(@value AS FLOAT) IS NOT NULL


Damien_The_Unbeliever notó que el suyo solo era bueno para los dígitos

Wade73 agregó un poco para manejar puntos decimales

Neizan hizo un ajuste adicional como no lo hizo en otro lugar

Desafortunadamente, ninguno parece manejar valores negativos y parecen tener problemas con una coma en el valor ...

Aquí está mi ajuste para recoger valores negativos y aquellos con comas

declare @MyTable table(MyVar nvarchar(10)); insert into @MyTable (MyVar) values (N''1234'') , (N''000005'') , (N''1,000'') , (N''293.8457'') , (N''x'') , (N''+'') , (N''293.8457.'') , (N''......'') , (N''.'') , (N''-375.4'') , (N''-00003'') , (N''-2,000'') , (N''3-3'') , (N''3000-'') ; -- This shows that Neizan''s answer allows "." to slip through. select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber; -- Notice the addition of "and MyVar not like ''.''". select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' and MyVar not like N''%.%.%'' and MyVar not like ''.'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber; --Trying to tweak for negative values and the comma --Modified when comparison select * from ( select MyVar , case when MyVar not like N''%[^0-9.,-]%'' and MyVar not like ''.'' and isnumeric(MyVar) = 1 then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber;


El código de Neizan permite valores de solo un "." mediante. A riesgo de ser demasiado pedante, agregué una cláusula AND más.

declare @MyTable table(MyVar nvarchar(10)); insert into @MyTable (MyVar) values (N''1234'') , (N''000005'') , (N''1,000'') , (N''293.8457'') , (N''x'') , (N''+'') , (N''293.8457.'') , (N''......'') , (N''.'') ; -- This shows that Neizan''s answer allows "." to slip through. select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber; -- Notice the addition of "and MyVar not like ''.''". select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' and MyVar not like N''%.%.%'' and MyVar not like ''.'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber;


ISNUMERIC no funciona: te dice que la cadena se puede convertir a cualquiera de los tipos numéricos, lo cual es casi siempre una información inútil para saber. Por ejemplo, todos los siguientes son numéricos, de acuerdo con ISNUMERIC:

£, $, 0d0

Si desea verificar dígitos y solo dígitos, una expresión LIKE negativa es lo que desea:

not Value like ''%[^0-9]%''


La respuesta de Wade73 para decimales no funciona del todo. Lo he modificado para permitir solo un punto decimal.

declare @MyTable table(MyVar nvarchar(10)); insert into @MyTable (MyVar) values (N''1234'') , (N''000005'') , (N''1,000'') , (N''293.8457'') , (N''x'') , (N''+'') , (N''293.8457.'') , (N''......''); -- This shows that Wade73''s answer allows some non-numeric values to slip through. select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber; -- Notice the addition of "and MyVar not like N''%.%.%''". select * from ( select MyVar , case when MyVar not like N''%[^0-9.]%'' and MyVar not like N''%.%.%'' then 1 else 0 end as IsNumber from @MyTable ) t order by IsNumber;


Me encontré con la necesidad de permitir valores decimales, así que not Value like ''%[^0-9.]%'' usé not Value like ''%[^0-9.]%''


puedes verificar así

declare @vchar varchar(50) set @vchar =''34343''; select case when @vchar not like ''%[^0-9]%'' then ''Number'' else ''Not a Number'' end


ISNUMERIC hará

Consulte también la sección de NOTAS en el artículo.


DECLARE @A nvarchar(100) = ''12'' IF(ISNUMERIC(@A) = 1) BEGIN PRINT ''YES NUMERIC'' END