web-dev-qa-db-ja.com

SQL ServerのIsIntegerに最適

フィールドの値が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句内で使用されます。

31
Mayo

1つのアプローチは

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

ダブルネガティブ、それらを愛するようになった!

37
AdaTheDev

負の値を処理する遅延エントリ

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

詳細については、 this を参照してください

55
gbn

SQL Server 2005+の場合、 CLRを有効にして、正規表現をサポートする関数を作成します 。 SQL Server 2000の場合、 同じことを行うUDFの作成については、この記事を参照

次に、正規表現を使用します:^\d{5}$

6
OMG Ponies

この式は、整数値に1を、それ以外の場合は0を返します

floor((floor(abs(zipcode)))/abs(zipcode))
4
george

なぜ次のものを使用しないのですか?失敗するケースを見つけることができません。

  • 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
1
cjbarth

私はCaseステートメントを使用してそれをしました:Cast(Case When Quantity/[#of Days] = Cast(Quantity/[#of Days] as int)Then abs(Quantity/[#of Days])Else 0 End as int)

0
Todd181

以下のコードが役立つかどうかを確認してください。以下の値では、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
0

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
jessieloo

入力値が整数かどうかをテストするには、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
0
vibs2006

StackOの別の質問で、これに対する完璧な答えを思いつきました。
それはまたあなたを証明しますcannotあるユーザーがここで提案するように ".0e0"を使用します。
CLRまたは非スカラー関数なしで実行します。
チェックアウトしてください: https://stackoverflow.com/a/10645764/555798

0
MikeTeeVee