Есть ли простой способ выяснить, является ли varchar числом?
Примеры:
abc123 → no number
123 → да, его число
Спасибо:)
Есть ли простой способ выяснить, является ли varchar числом?
Примеры:
abc123 → no number
123 → да, его число
Спасибо:)
ISNUMERIC будет
Также проверьте раздел NOTES в статье.
ISNUMERIC не будет делать - он сообщает вам, что строка может быть преобразована в любой из числовых типов, что почти всегда является бессмысленной информацией, которую нужно знать. Например, все следующие числовые, в соответствии с ISNUMERIC:
£, $, 0d0
Если вы хотите проверить цифры и только цифры, отрицательное выражение LIKE - это то, что вы хотите:
not Value like '%[^0-9]%'
вы можете проверить это как
declare @vchar varchar(50)
set @vchar ='34343';
select case when @vchar not like '%[^0-9]%' then 'Number' else 'Not a Number' end
Используя SQL Server 2012+, вы можете использовать функции TRY_ *, если у вас есть особые потребности. Например,
-- 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
Я столкнулся с необходимостью допускать десятичные значения, поэтому использовал not Value like '%[^0-9.]%'
Ответ Wade73 для десятичных знаков не работает. Я изменил его, чтобы разрешить только одну десятичную точку.
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 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;
Damien_The_Unbeliever отметил, что он был хорош только для цифр
Wade73 добавил бит для обработки десятичных точек
neizan сделал дополнительную настройку, так как не сделал этого,
К сожалению, ни один из них не обрабатывает отрицательные значения, и они, похоже, имеют проблемы с запятой в значении...
Здесь моя настройка для получения отрицательных значений и запятых
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 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;
DECLARE @A nvarchar(100) = '12'
IF(ISNUMERIC(@A) = 1)
BEGIN
PRINT 'YES NUMERIC'
END
Код Neizan позволяет использовать значения только ".". через. Рискуя стать слишком педантичным, я добавил еще одно предложение AND
.
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 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;