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