Что делает IsNumeric? - PullRequest
       2

Что делает IsNumeric?

3 голосов
/ 11 октября 2010

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

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

select ISNUMERIC('5d9')

Ответы [ 5 ]

3 голосов
/ 11 октября 2010

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

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

Я думаю, что в данном случае он рассматривает "d" как десятичное и, следовательно, считает его числом.

Я думаю, что 5e9 должно быть похожим, так как "e" также используется математически для обозначения показателя степени. У вас нет SQL, чтобы попробовать это прямо сейчас ... но я думаю, что результат 5e9 должен быть 1 по той же причине 1007 *

РЕДАКТИРОВАТЬ: немного больше контекста здесь (результат быстрого поиска в Google !!)

1 голос
/ 11 октября 2010

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

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

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

1 голос
/ 11 октября 2010
select cast('5d9' as float)

Возвращает

5000000000

d работает так же, как и e

0 голосов
/ 25 июля 2014

Вам понадобится дополнительное тестирование, чтобы сделать лучший тест.Попробуйте использовать оператор 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)
0 голосов
/ 11 октября 2010

Гекса: 5d9 <==> Десятичное число: 1497

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...