ISNUMERIC('07213E71') = Верно?

SQL обнаруживает, что следующая строка ISNUMERIC:

'07213E71'

Я считаю, что это потому, что буква «Е» классифицируется как математический символ.

Однако мне нужно убедиться, что только значения, которые являются целыми числами, возвращаются как True.

Как я могу это сделать?


person Curt    schedule 13.05.2011    source источник


Ответы (5)


07213E71 — плавающее число 7213 с 71 нулем

Вы можете использовать этот ISNUMERIC(myValue + '.0e0') для проверки целых чисел. Немного загадочно, но работает.

Другой тест — двойное отрицательное число myValue NOT LIKE '%[^0-9]%', допускающее только цифры от 0 до 9.

У ISNUMERIC есть и другие проблемы, поскольку все они возвращают 1: +, -,

person gbn    schedule 13.05.2011
comment
Я не рекомендую делать это в запросе, потому что в некоторых случаях это может привести к тайм-аутам. SQL не для этих целей. - person elvenbyte; 13.05.2011
comment
Почему это может привести к тайм-ауту? Мне кажется простое решение - person Curt; 13.05.2011
comment
@Curt: я предполагаю, что elvenbyte означает не использовать его в предложении WHERE. Однако у вас уже есть функция для столбца, поэтому добавление строки не повлияет на ситуацию. - person gbn; 13.05.2011
comment
'0e0' также вернет true для дробного числа. Для проверки целых чисел следует использовать «.0e0». Вы также можете проверить положительные числа следующим образом: IsNumeric('-' + Value + '.0e0') - person George Mastros; 13.05.2011
comment
Также может потребоваться проверить длину входной строки, чтобы избежать ошибок переполнения, присваивающих слишком большие целочисленные значения типу данных, которого недостаточно для хранения такого большого количества данных. Простой пример с проверкой LEN(): DECLARE (a)value NVARCHAR(255) = '9876543210', (a)result INT ; ЕСЛИ ISNUMERIC((a)значение + '.0e0') = 1 AND LEN((a)значение) ‹ 10 SET (a)result = (a)value ; SELECT (a) результат (да, я знаю, что max INT на самом деле будет 2147483647, проверка с помощью LEN() ограничивает это значение до 999999999). - person Andreas Jansson; 25.04.2016

Для придирки: это целое число. Это эквивалентно 7213 * 10 ^ 71.

person Daniel Hilgarth    schedule 13.05.2011
comment
Да, но он хочет знать, как передать это в запрос как простое число без обозначения, потому что SQL не понимает это обозначение. - person elvenbyte; 13.05.2011
comment
@elvenbyte Я читал, что он не хотел рассматривать 7213 * 10 ^ 71 как целое число (хотя это так) - person Rowland Shaw; 13.05.2011

В документации написано

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

Ваше число также является числом с плавающей запятой (с экспоненциальной записью), поэтому единственный способ получить ISINTEGER - это определить его самостоятельно в SQL. Прочтите следующую ссылку.

http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html

Дополнительно:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=59049

http://www.tek-tips.com/faqs.cfm?fid=6423

person Ahmet Alp Balkan    schedule 13.05.2011

Я столкнулся с той же проблемой. IsNumeric принимает «$, €, +, - и т. д.» в качестве допустимых входных данных, и из-за этого функция Convert выдает ошибки. Использование инструкции SQL «LIKE» устранило мою проблему. Я надеюсь, что это поможет другим

SELECT UnitCode, UnitGUID, Convert(int, UnitCode) AS IntUnitCode
      FROM [NG_Data].[NG].[T_GLB_Unit]  
     WHERE ISNULL(UnitType,'') <>'Department'
       AND UnitCode NOT LIKE '%[^0-9]%'
  ORDER BY IntUnitCode

PS: не вините меня за использование UnitCode в качестве nvarchar :) Это старый проект :)

person Recev Yildiz    schedule 12.06.2013
comment
Немного поздно, но '%[0-9]%' не соответствует aaaaaa5aaaaa? - person Marie; 29.03.2017
comment
@Мари, ты прав. Я отредактировал ответ. Спасибо за предупреждение :) - person Recev Yildiz; 05.05.2017

Вы должны убедиться в этом из вызова базы данных, независимо от языка, с которым вы работаете, а затем передать значение в запрос. Вероятно, SQL понимает это значение как строку.

person elvenbyte    schedule 13.05.2011
comment
Не так много ответа: как это помогает ОП? - person gbn; 13.05.2011