есть ли простой способ выяснить, является ли varchar числом?
Примеры:
abc123 --› без номера
123 --› да, это номер
Спасибо :)
есть ли простой способ выяснить, является ли varchar числом?
Примеры:
abc123 --› без номера
123 --› да, это номер
Спасибо :)
ISNUMERIC подойдет
Также проверьте раздел ПРИМЕЧАНИЯ в статье.
ISNUMERIC не подойдет — он говорит вам, что строка может быть преобразована в любой из числовых типов, что почти всегда является бессмысленной информацией. Например, согласно ISNUMERIC все следующие числа являются числовыми:
£, $, 0d0
Если вы хотите проверить цифры и только цифры, вам нужно отрицательное выражение LIKE:
not Value like '%[^0-9]%'
not Value like '%[^0-9]%'
, точно таков, что все символы являются цифрами. Это двойной минус. Он утверждает, что ни один символ в Value
не находится за пределами диапазона 0-9
.
- person Damien_The_Unbeliever; 08.11.2016
Value like '%[0-9]%'
будет строкой, содержащей хотя бы один цифровой символ. Value like '%[^0-9]%'
будет означать, что строка содержит хотя бы один нецифровой символ. Но, опять же, мой тест - not Value like '%[^0-9]%'
, который отрицает предыдущий тест, и строка не содержит нецифровых символов.
- person Damien_The_Unbeliever; 08.11.2016
можно так проверить
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'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;
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'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;
Код Нейзан допускает значения только "." через. Рискуя стать слишком педантичным, я добавил еще одно предложение 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'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;
Не забудьте исключить из ваших данных возврат каретки!!!
as in:
SELECT
Myotherval
, CASE WHEN TRIM(REPLACE([MyVal], char(13) + char(10), '')) not like '%[^0-9]%' and RTRIM(REPLACE([MyVal], char(13) + char(10), '')) not like '.' and isnumeric(REPLACE([MyVal], char(13) + char(10), '')) = 1 THEN 'my number: ' + [MyVal]
ELSE ISNULL(Cast([MyVal] AS VARCHAR(8000)), '')
END AS 'MyVal'
FROM MyTable
isnumeric
, но у него множество особенностей а> - person Martin Smith   schedule 05.01.20111e23
? - person Martin Smith   schedule 05.01.2011