フィールドの値が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]'
Try/catchブロック内でvarcharパラメーターをintに変換しようとするユーザー定義関数を作成できますが、この目標を達成するために成功したメソッドに誰かが遭遇したかどうかをコミュニティで確認しています-できれば他のオブジェクトを作成せずに、SQLステートメントのwhere句内で使用されます。
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))
なぜ次のものを使用しないのですか?失敗するケースを見つけることができません。
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
私はCaseステートメントを使用してそれをしました:Cast(Case When Quantity/[#of Days] = Cast(Quantity/[#of Days] as int)Then abs(Quantity/[#of Days])Else 0 End as int)
以下のコードが役立つかどうかを確認してください。以下の値では、9、2147483647、1234567のみが整数として適格です。これを関数として作成し、使用できます。
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
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
入力値が整数かどうかをテストするには、SQL SERVERのSQL_VARIANT_PROPERTY関数を使用できます。
次の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
StackOの別の質問で、これに対する完璧な答えを思いつきました。
それはまたあなたを証明しますcannotあるユーザーがここで提案するように ".0e0"を使用します。
CLRまたは非スカラー関数なしで実行します。
チェックアウトしてください: https://stackoverflow.com/a/10645764/555798