Ответ 1
Подход1
zipcode NOT LIKE '%[^0-9]%'
Двойные негативы, их любят!
Каков наилучший способ определить, является ли значение поля целым числом в 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 без создания других объектов.
1
zipcode NOT LIKE '%[^0-9]%'
Двойные негативы, их любят!
Поздняя запись, обрабатывающая отрицательный
ISNUMERIC(zipcode + '.0e0') --integer
ISNUMERIC(zipcode + 'e0') --decimal
Подробнее см. this
Если SQL Server 2005+, я бы включить CLR и создать функцию для поддержки регулярных выражений. Для SQL Server 2000 см. Эту статью для создания UDF, чтобы сделать то же самое.
Затем я буду использовать регулярное выражение: ^\d{5}$
Это выражение дает 1 для целочисленного значения и 0 в противном случае
floor((floor(abs(zipcode)))/abs(zipcode))
Я придумал идеальный ответ для этого на другой вопрос StackO.
Это также доказывает, что не может использовать".0e0", как это предлагает один пользователь.
Это делает без CLR или нескалярных функций.
Пожалуйста, проверьте это: fooobar.com/questions/213447/...
Почему бы просто не использовать следующее? Я не вижу, чтобы найти случаи, когда он терпит неудачу.
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
После перехода на 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
Посмотрите, поможет ли приведенный ниже код. В приведенных ниже значениях только 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
Я сделал это с помощью оператора Case: Cast (Case When Quantity/[# of Days] = Cast (количество/[число дней] как int) Затем abs (количество/[число дней]) Else 0 End as int)
Чтобы проверить, является ли входное значение целым или нет, мы можем использовать функцию 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
Возможно, вы должны хранить только целые данные в целочисленных типах данных.