Подтвердить что ты не робот

Лучший эквивалент IsInteger в SQL Server

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

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

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

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

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

4b9b3361

Ответ 1

Подход

1

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

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

Ответ 2

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

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

Подробнее см. this

Ответ 4

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

floor((floor(abs(zipcode)))/abs(zipcode))

Ответ 5

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

Ответ 6

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

  • 1 = целое число
  • 0 = не целое
  • null = не numeric
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

Ответ 7

После перехода на 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

Ответ 8

Посмотрите, поможет ли приведенный ниже код. В приведенных ниже значениях только 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

Ответ 9

Я сделал это с помощью оператора Case: Cast (Case When Quantity/[# of Days] = Cast (количество/[число дней] как int) Затем abs (количество/[число дней]) Else 0 End as int)

Ответ 10

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

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

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

Ответ 11

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