ISNUMERIC
возвращает 1, когда выражение ввода оценивает допустимый числовой тип данных; в противном случае он возвращает 0 (MSDN reference).Что делает IsNumeric?
Итак, почему вывод этого запроса 1?
select ISNUMERIC('5d9')
ISNUMERIC
возвращает 1, когда выражение ввода оценивает допустимый числовой тип данных; в противном случае он возвращает 0 (MSDN reference).Что делает IsNumeric?
Итак, почему вывод этого запроса 1?
select ISNUMERIC('5d9')
Не уверен, что немного принимая выстрел на него !! :-)
ISNUMERIC возвращает 1, если выражение ввода имеет значение действительного числа, число с плавающей запятой, деньги или десятичный тип
Я думаю, что в этом случае, он рассматривает «D», чтобы стоять в десятичной и, следовательно, считая его числом.
Я думаю, что 5e9 должен быть аналогичным, так же как и «e» также используется математически для обозначения экспоненты. Не имеет SQL здесь, чтобы попробовать его прямо сейчас .. но я думаю, результат 5e9 должен быть 1 по той же причине
EDIT: Некоторые больше контекста here (результат некоторого быстрого Googling !!)
select cast('5d9' as float)
Возвращает
5000000000
d
представляется, ш ork таким же образом, как e
ISNUMERIC()
не имеет практического применения и, как правило, следует избегать.
Сообщает вам, может ли строка быть преобразована в числовой тип данных, но, как вы видели, может включать в себя, казалось бы, случайные символы. например. он может также включать в себя +, -, $ и т. д.
(очевидно, они не случайны, но если вы используете ISNUMERIC()
для проверки, вам будет сложно найти случай, когда вы хотите разрешить все возможности это позволяет)
Для проведения лучшего теста вам понадобится дополнительное тестирование. Рассмотрите возможность использования оператора 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)
Самое интересное. 5a9 - это не 5d9. Будет наблюдать за этим. – spender