Лучший эквивалент для IsInteger в SQL Server - PullRequest
30 голосов
/ 01 марта 2010

Каков наилучший способ определить, является ли значение поля целым числом в SQL Server (2000/2005/2008)?

IsNumeric возвращает true для множества форматов, которые вряд ли будут преобразованы в целое число. Примеры включают «15 000» и «15 .1».

Вы можете использовать оператор like, но, похоже, он хорошо работает только для полей с заранее определенным количеством цифр ...

select * where zipcode like '[0-9][0-9][0-9][0-9][0-9]'

Я мог бы написать пользовательскую функцию, которая пытается преобразовать параметр varchar в int в блоке try / catch, но я проверяю сообщество, чтобы узнать, сталкивался ли кто-нибудь с любыми подходящими методами для достижения этой цели - предпочтительно тот, который может использоваться в предложении where инструкции SQL без создания других объектов.

Ответы [ 11 ]

54 голосов
/ 03 марта 2010

Поздняя запись, которая обрабатывает отрицательный

ISNUMERIC(zipcode + '.0e0') --integer
ISNUMERIC(zipcode + 'e0')  --decimal

Подробнее см. это

37 голосов
/ 01 марта 2010

1 подход

zipcode NOT LIKE '%[^0-9]%'

Двойной негатив, люби их!

6 голосов
/ 01 марта 2010

Если SQL Server 2005+, я бы включил CLR и создал бы функцию для поддержки регулярных выражений . Для SQL Server 2000, см. Эту статью для создания UDF, чтобы сделать то же самое .

Тогда я бы использовал регулярное выражение: ^\d{5}$

4 голосов
/ 14 марта 2011

Это выражение дает 1 для целочисленного значения и 0 в противном случае

floor((floor(abs(zipcode)))/abs(zipcode))
1 голос
/ 05 июня 2012

Почему бы просто не использовать следующее? Я не вижу, чтобы найти случаи, когда это терпит неудачу.

  • 1 = целое число
  • 0 = не целое число
  • null = не числовой
DECLARE @TestValue nvarchar(MAX)
SET @TestValue = '1.04343234e5'

SELECT CASE WHEN ISNUMERIC(@TestValue) = 1
        THEN CASE WHEN ROUND(@TestValue,0,1) = @TestValue
            THEN 1
            ELSE 0
            END
        ELSE null
        END AS Analysis
0 голосов
/ 31 августа 2017

Чтобы проверить, является ли входное значение целым числом или нет, мы можем использовать SQL_VARIANT_PROPERTY функцию SQL SERVER.

Следующий скрипт SQL примет входные данные и проверит, является ли тип данных целочисленным или нет

declare @convertedTempValue bigint, @inputValue nvarchar(255) = '1' --Change '1' to any input value
set @convertedTempValue = TRY_PARSE(@inputValue as bigint) --we trying to convert to bigint
declare @var3 nvarchar(255) = cast (SQL_VARIANT_PROPERTY(@convertedTempValue,'BaseType') as nvarchar(255)) --we using SQL_VARIANT_PROPERTY to find out datatype
if ( @var3 like '%int%')
    begin
    print 'value is integer'
    end
else
    begin
    print 'value is non integer'
    end
go
0 голосов
/ 04 ноября 2016

Я сделал это с помощью оператора Case: Приведение (Случай, когда Количество / [Количество дней] = Приведение (Количество / [Количество дней] как int) Затем abs (Количество / [Количество дней]) Остальное 0 Конец как int)

0 голосов
/ 01 июля 2016

Посмотрите, поможет ли приведенный ниже код. В приведенных ниже значениях только 9, 2147483647, 1234567 имеют право на Integer. Мы можем создать это как функцию и использовать это.

CREATE TABLE MY_TABLE(MY_FIELD VARCHAR(50))
INSERT INTO MY_TABLE
VALUES('9.123'),('1234567'),('9'),('2147483647'),('2147483647.01'),('2147483648'), ('2147483648ABCD'),('214,7483,648')

SELECT *
FROM MY_TABLE
WHERE CHARINDEX('.',MY_FIELD) = 0 AND CHARINDEX(',',MY_FIELD) = 0       
AND ISNUMERIC(MY_FIELD) = 1 AND CONVERT(FLOAT,MY_FIELD) / 2147483647 <= 1
DROP TABLE MY_TABLE
0 голосов
/ 18 мая 2015

После перехода на sql 2008 я боролся с тем, чтобы isnumeric ('\ 8') возвращало true, но выдавало ошибку при приведении к целому числу Видимо, прямая косая черта является действительной валютой для иены или выигрыша - (ссылка http://www.louiebao.net/blog/200910/isnumeric/)

Мое решение было

case when ISNUMERIC(@str) > 0 and not rtrim(@str) LIKE '[^0-9]%'  and not rtrim(@str) LIKE '%[^0-9]' and not rtrim(@str) LIKE '[^0-9]%' then rtrim(@str) else null end
0 голосов
/ 18 мая 2012

Я нашел идеальный ответ для этого на другой вопрос StackO.
Это также доказывает, что не может использовать ".0e0", как предлагает один из пользователей.
Это делается без CLR или нескалярных функций.
Пожалуйста, проверьте это: https://stackoverflow.com/a/10645764/555798

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