есть ли простой способ выяснить, является ли varchar числом?Проверьте, является ли varchar числом (TSQL)
Примеры:
ABC123 -> нет номер
123 -> да, его номер
Спасибо :)
есть ли простой способ выяснить, является ли varchar числом?Проверьте, является ли varchar числом (TSQL)
Примеры:
ABC123 -> нет номер
123 -> да, его номер
Спасибо :)
ISNUMERIC будет делать
Проверьте раздел NOTES в статье ,
вы можете проверить, как этот
declare @vchar varchar(50)
set @vchar ='34343';
select case when @vchar not like '%[^0-9]%' then 'Number' else 'Not a Number' end
. Спасибо. – Reza
ISNUMERIC не будет делать - это говорит о том, что строка может быть преобразована в любой числовых типов, которые почти всегда бессмысленно часть информации, чтобы знать , Например, все следующие числовые, согласно ISNUMERIC:
£, $, 0D0
Если вы хотите, чтобы проверить цифры и только цифры, отрицательным LIKE выражения является то, что вы хотите :
not Value like '%[^0-9]%'
Этот ответ и бинил спас меня от необходимости задавать мой собственный вопрос. Спасибо, кучи. –
ISNUMERIC также считает, что «-» является числовым. –
Это отличный метод, если вам нужны только целые положительные числа, но я добавил несколько примеров ниже, если вам нужно разрешить другие типы числовых типов, если вы используете SQL 2012+. –
я столкнулся с необходимостью разрешить десятичные значения, так что я использовал not Value like '%[^0-9.]%'
DECLARE @A nvarchar(100) = '12'
IF(ISNUMERIC(@A) = 1)
BEGIN
PRINT 'YES NUMERIC'
END
Ответ 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;
И мне пришлось добавить <> '. К счастью, ни у кого из моих данных нет «-» не в том месте – Colin
Код 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'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;
Используя 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
Это лучшее решение. Решения, использующие% [^ 0-9.]%, Похоже, возвращаются, говорят, что это число, когда оно содержит число, даже если в строке есть символы. Этот TRY_CAST работает для меня. – RosieC
Просто имейте в виду, что он требует SQL Server 2012+ - не будет работать в 2008R2 или ниже и не будет работать в других СУБД –
Damien_The_Unbeliever отметил, что его было хорошо только для цифр
Wade73 не добавил немного для обработки десятичных точек
neizan сделал дополнительный твик как и notwhereuareat
К сожалению, ни один как представляется, обрабатывают отрицательные значения, и они, похоже, имеют проблемы с запятой в значении ...
Вот мой подправить подобрать отрицательные значения и те, с запятыми
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;
'isnumeric' но [имеет много причуд] (https://connect.microsoft.com/SQLServer/feedback/details/302466/isnumeric-returns -true-for-and) –
Какие причуды? – grady
Я добавил ссылку выше в элемент Microsoft Connect с некоторыми примерами и объяснением MS. Какие числовые форматы вам нужны для соответствия? Например, вам нужно было бы сопоставить что-то вроде '1e23'? –