2010-10-11 4 views
3

ISNUMERIC возвращает 1, когда выражение ввода оценивает допустимый числовой тип данных; в противном случае он возвращает 0 (MSDN reference).Что делает IsNumeric?

Итак, почему вывод этого запроса 1?

select ISNUMERIC('5d9') 
+0

Самое интересное. 5a9 - это не 5d9. Будет наблюдать за этим. – spender

ответ

3

Не уверен, что немного принимая выстрел на него !! :-)

ISNUMERIC возвращает 1, если выражение ввода имеет значение действительного числа, число с плавающей запятой, деньги или десятичный тип

Я думаю, что в этом случае, он рассматривает «D», чтобы стоять в десятичной и, следовательно, считая его числом.

Я думаю, что 5e9 должен быть аналогичным, так же как и «e» также используется математически для обозначения экспоненты. Не имеет SQL здесь, чтобы попробовать его прямо сейчас .. но я думаю, результат 5e9 должен быть 1 по той же причине

EDIT: Некоторые больше контекста here (результат некоторого быстрого Googling !!)

+0

5e9 является числовым. Хороший ответ. +1 – spender

+0

Hmm ... select cast ('5d9' as int) не работает. Какой беспорядок. – spender

0

Hexa: 5d9 < ==> Десятичные: 1497

+4

5a9 нет, поэтому это падает. – spender

+0

@spender: yeap, первое, что я пробовал, когда увидел, что вопрос был '5f9', не повезло. '5e9' работает, хотя ...' e', вероятно, экспоненциальная нотация, но 'd'? – Diadistis

1
select cast('5d9' as float) 

Возвращает

5000000000 

d представляется, ш ork таким же образом, как e

1

ISNUMERIC() не имеет практического применения и, как правило, следует избегать.

Сообщает вам, может ли строка быть преобразована в числовой тип данных, но, как вы видели, может включать в себя, казалось бы, случайные символы. например. он может также включать в себя +, -, $ и т. д.

(очевидно, они не случайны, но если вы используете ISNUMERIC() для проверки, вам будет сложно найти случай, когда вы хотите разрешить все возможности это позволяет)

0

Для проведения лучшего теста вам понадобится дополнительное тестирование. Рассмотрите возможность использования оператора Case.

declare @var varchar(32) 

select @var = '42e2' 

select @var AS InputValue, 
     ISNUMERIC(@var) AS TestResult, 
     Case ISNUMERIC(@var) 
     When 1 
      Then CONVERT(float, @var) 
     Else 
      0 
     End AS SimpleConversion, 
     Case ISNUMERIC(@var) 
     When 1 
      Then 
      Case 
       When CONVERT(varchar(32), CONVERT(float, @var)) = @var 
       Then CONVERT(float, @var) 
       Else 
       0 
      End 
     Else 
      0 
     End AS IntegerResult 


InputValue      TestResult SimpleConversion  IntegerResult 
-------------------------------- ----------- ---------------------- ---------------------- 
42e2        1   4200     0 

(1 row(s) affected)