Использование IF IsNumeric в качестве аргумента - PullRequest
7 голосов
/ 15 февраля 2012

Мне было интересно, как использовать IsNumeric в SQL, это немного отличается от VBScript, но я думаю, что смог обойти это, то есть:

 IF 1 = ISNUMERIC('5675754674') 
 BEGIN 
 ...
 END

Будет ли это обходным путем? Что я действительно хочу сделать, это:

IF ISNUMERIC('5675754674')
BEGIN 
... 
END

но это дает ошибку. Пример 1, похоже, работает, но, просто убедившись, что я все делаю правильно, не смог найти в Интернете хороших ресурсов по этому поводу.

Ответы [ 3 ]

15 голосов
/ 15 февраля 2012

В SQL Server нет boolean. Это означает, что вы не можете просто сказать IF (expression); вы должны сравнить это с чем-то, потому что оно возвращает true или false в том же смысле, в каком вы, вероятно, привыкли к другим языкам.

Просто предпочтение, но я бы предпочел написать это так:

IF ISNUMERIC('5675754674') = 1
BEGIN
...
END

В SQL Server нет способа избежать сравнения с 1, как во втором примере.

Кроме того, вы должны знать о слабых сторонах ISNUMERIC() - он может давать ложные срабатывания для «числовых» значений, таких как ., CHAR(9), e, $ и множество другие нечисловые строки. Если вы хотите узнать, является ли что-то целым, например, лучше сказать:

IF '5675754674' NOT LIKE '%[^0-9]%'
BEGIN
...
END

Но даже это не полный и действительный тест, потому что он вернет true для значений > (2^32)-1 и вернет false для отрицательных значений.

Еще одним недостатком ISNUMERIC() является то, что он вернет true, если значение можно преобразовать в любой числовых типов, что не совпадает с всеми числовыми типами. Часто люди проверяют на ISNUMERIC(), а затем пытаются преобразовать FLOAT в SMALLINT, и преобразование не удается.

В SQL Server 2012 у вас будет новый метод с именем TRY_CONVERT(), который возвращает NULL, если преобразование в указанный тип данных недопустимо.

5 голосов
/ 15 февраля 2012

Вы правы, ISNUMERIC () возвращает int.Вы можете проверить документацию: ISNUMERIC ()

2 голосов
/ 15 февраля 2012

Для оператора IF в SQL требуется логическое выражение после IF - см. ссылку на MSDN здесь.

SQL не является лучшим в обработке приведения между типами без использования чего-то вроде CAST() или CONVERT(), что означает, что возвращаемые значения int ISUNUMERIC() будут разрешены как логические, только если вы используете какой-то компаратор (=, <,> и т. д.) для получения истинного / ложного результата.

IF ISNUMERIC('5675754674') = 1, вероятно, лучший способ записать это в TSQL - он четко описывает намерение «Если это значение, проходящее через эту функцию, возвращает 1 (может быть оценено как числовой тип данных), то сделайте это. '

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

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