2011-01-05 2 views
48

есть ли простой способ выяснить, является ли varchar числом?Проверьте, является ли varchar числом (TSQL)

Примеры:

ABC123 -> нет номер

123 -> да, его номер

Спасибо :)

+3

'isnumeric' но [имеет много причуд] ​​(https://connect.microsoft.com/SQLServer/feedback/details/302466/isnumeric-returns -true-for-and) –

+0

Какие причуды? – grady

+1

Я добавил ссылку выше в элемент Microsoft Connect с некоторыми примерами и объяснением MS. Какие числовые форматы вам нужны для соответствия? Например, вам нужно было бы сопоставить что-то вроде '1e23'? –

ответ

27

ISNUMERIC будет делать

Проверьте раздел NOTES в статье ,

+7

@Grady - Я думаю, что ответ Дэмиена ниже, как указано, IsNumeric имеет некоторые ограничения. Вы уверены, что вы не сталкиваетесь с такими ограничениями? –

+2

прокрутите вниз, чтобы заметить следующий ответ. – greg121

+3

"select isnumeric ('138D47')" возвращает 1 – Nuzzolilo

23

вы можете проверить, как этот

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

. Спасибо. – Reza

108

ISNUMERIC не будет делать - это говорит о том, что строка может быть преобразована в любой числовых типов, которые почти всегда бессмысленно часть информации, чтобы знать , Например, все следующие числовые, согласно ISNUMERIC:

£, $, 0D0

Если вы хотите, чтобы проверить цифры и только цифры, отрицательным LIKE выражения является то, что вы хотите :

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

Этот ответ и бинил спас меня от необходимости задавать мой собственный вопрос. Спасибо, кучи. –

+2

ISNUMERIC также считает, что «-» является числовым. –

+0

Это отличный метод, если вам нужны только целые положительные числа, но я добавил несколько примеров ниже, если вам нужно разрешить другие типы числовых типов, если вы используете SQL 2012+. –

8

я столкнулся с необходимостью разрешить десятичные значения, так что я использовал not Value like '%[^0-9.]%'

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

Ответ 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; 
+0

И мне пришлось добавить <> '. К счастью, ни у кого из моих данных нет «-» не в том месте – Colin

1

Код 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; 
14

Используя 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

Это лучшее решение. Решения, использующие% [^ 0-9.]%, Похоже, возвращаются, говорят, что это число, когда оно содержит число, даже если в строке есть символы. Этот TRY_CAST работает для меня. – RosieC

+1

Просто имейте в виду, что он требует SQL Server 2012+ - не будет работать в 2008R2 или ниже и не будет работать в других СУБД –

2

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;