2009-09-04 1 views
5

どうすれば実現できますか?SQL Serverのフィールドはintですか?

select * from table where column_value is int 

おそらくシステムテーブルと型テーブルに内部結合することができますが、よりエレガントな方法があるのだろうかと思います。

column_valueは、intを持つ可能性があるが、必ずしもそうでないvarcharであることに注意してください。

たぶん私はそれを投げてエラーを捕まえることができますか?しかし、再び、それはハックのように思えます。

+2

ここでのハックは、数字として扱うテキスト列にデータがあることです。あなたは本当にそれをしてはいけませんが、私はあなたがすでにその理由を発見したと思います。 –

答えて

2
select * from table 
where column_value not like '[^0-9]' 

負のint型が許可されている場合は、COLUMN_VALUEは「INT」タイプの限界を超える整数であることができる場合は、より多くのコードを必要とし、除外する

where column_value like '[+-]%' 
and substring(column_value,patindex('[+-]',substring(column_value,1))+1,len(column_value)) 
not like '[^0-9]' 

ようなものが必要そのような場合。カスタム機能を実装したい場合はここで

+0

これが正しいかどうかわからないが、最初の文字だけが「数字ではない」ということをテストしないだろうか?あなたは '%[^ 0-9]%'のようにcolumn_valueを使用してはいけませんか? – VoidKing

+0

OR '%[0-9]%'のようなcolumn_value? – VoidKing

2

CREATE Function dbo.IsInteger(@Value VARCHAR(18)) 
RETURNS BIT 
AS 
BEGIN  
    RETURN ISNULL(  
     (SELECT CASE WHEN CHARINDEX('.', @Value) > 0 THEN 
          CASE WHEN CONVERT(int, PARSENAME(@Value, 1)) <> 0 THEN 0 ELSE 1 END 
        ELSE 1 
        END  
      WHERE  ISNUMERIC(@Value + 'e0') = 1), 0) 

END 

ISNUMERICリターン1入力​​ 式が有効 整数に評価された場合、浮動小数点数、お金 またはdecimal型。それ以外の場合は を返します。戻り値1の場合、式は のいずれかの数値型に変換されます。

+0

「123」が検出されました。 Integerとして変換することはできません:( – Faiz

0

Svetlozarアンゲロフが示唆するように、私は、UDFを行うだろうが、私は最初のISNUMERICをチェック(とされていない場合は0を返す)、およびそれが整数だかどうかを確認するためにcolumn_value % 1 = 0をチェックします。

身体は次のようになります。値が数値でない場合、例外をスローするので、モジュロロジックを別の分岐に配置する必要があります。

DECLARE @RV BIT 
IF ISNUMERIC(@value) BEGIN 
    IF CAST(@value AS NUMERIC) % 1 = 0 SET @RV = 1 
    ELSE SET @RV = 0 
END 
ELSE SET @RV = 0 
RETURN @RV 
0

これは、例外をスローすることなく、すべてのケースを処理する必要があります:

--This handles dollar-signs, commas, decimal-points, and values too big or small, 
-- all while safely returning an int. 
DECLARE @IntString as VarChar(50) = '$1,000.' 
SELECT CAST((CASE WHEN --This IsNumeric check here does most of the heavy lifting. The rest is Integer-Specific 
         ISNUMERIC(@IntString) = 1 
         --Only allow Int-related characters. This will exclude things like 'e' and other foreign currency characters. 
        AND @IntString NOT LIKE '%[^ $,.\-+0-9]%' ESCAPE '\'--' 
         --Checks that the value is not out of bounds for an Integer. 
        AND CAST(REPLACE(REPLACE(@IntString,'$',''),',','') as Decimal(38)) BETWEEN -2147483648 AND 2147483647 
         --This allows values with decimal-points for count as an Int, so long as there it is not a fractional value. 
        AND CAST(REPLACE(REPLACE(@IntString,'$',''),',','') as Decimal(38)) = CAST(REPLACE(REPLACE(@IntString,'$',''),',','') as Decimal(38,2)) 
         --This will safely convert values with decimal points to casting later as an Int. 
        THEN CAST(REPLACE(REPLACE(@IntString,'$',''),',','') as Decimal(10)) 
      END) as Int)[Integer] 

スカラUDFにこれを投げるとReturnInt()それを呼び出します。
値がNULLとして戻ってきた場合、それはint型ではありません(そう、あなたのIsInteger()の要件があります)

あなたが「ReturnInt(someValueのは) NULLでない場合を」あなたは、可能性がタイピング好きではない場合IsInt()という別のスカラーUDFにこの関数を呼び出し、単に "ReturnInt(SomeValue)IS NOT NULL"を返します。

クールなことは、「安全に」をint値に変換して返すことで、UDFが二重の役割を果たすことです。
ちょうど何かの理由から、は、であることは、intとしてキャストすることを意味するものではありませんが、巨大な例外をスローしません。これはあなたのためにそれを処理します。

また、私は、この普遍的なアプローチではカンマ、小数点記号、ドル記号を処理し、許容可能なInt値の範囲をチェックするため、他のソリューションは避けたいと思います。パフォーマンスを最大化するためにスカラ関数のロジックを使用します。

以下の例を参照してください、私のコードや他の人に対してそれらをテストします。

--Proves that appending "e0" or ".0e0" is NOT a good idea. 
select ISNUMERIC('$1' + 'e0')--Returns: 0. 
select ISNUMERIC('1,000' + 'e0')--Returns: 0. 
select ISNUMERIC('1.0' + '.0e0')--Returns: 0. 

--While these are numeric, they WILL break your code 
-- if you try to cast them directly as int. 
select ISNUMERIC('1,000')--Returns: 1. 
select CAST('1,000' as Int)--Will throw exception. 
select ISNUMERIC('$1')--Returns: 1. 
select CAST('$1' as Int)--Will throw exception. 
select ISNUMERIC('10.0')--Returns: 1. 
select CAST('10.0' as Int)--Will throw exception. 
select ISNUMERIC('9999999999223372036854775807')--Returns: 1. This is why I use Decimal(38) as Decimal defaults to Decimal(18). 
select CAST('9999999999223372036854775807' as Int)--Will throw exception. 


更新:
私はあなたが123」のような値を解析することができるようにしたいことをここのコメントを読んで。 '整数に変換する。これを処理するコードも更新しました。

注:これは「1.0」を変換しますが、「1.9」にはnullを返します。
ROUND(CAST(REPLACE(REPLACE(@IntString、 '$'、 '')、 ')は、丸めを許可する場合は、「THEN」節のロジックを微調整してRound()を追加します。
ROUND (10))、0)
は丸めまたは切り捨てができるように小数点を確認する「AND」も削除する必要があります。

0

なぜ以下を使用して1をテストしてみませんか?

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

あなたは純粋に文字列を検証するために探している場合は、すべての数字だけでなくキャストできますが、この恐ろしい、恐ろしいことを行うことができますintにある:

select LEN(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
'-1.223344556677889900e-1' 
,'0','') ,'1','') ,'2','') ,'3','') ,'4','') ,'5','') ,'6','') ,'7','') ,'8','') ,'9','') 
) 

文字列だったときには0を返します。空または純数字。

"poor-man's" Integerの便利なチェックをするには、空の文字列と最初のマイナス記号を処理する必要があります。また、INTEGERのさまざまな種類に合わせて手動で長すぎないようにしてください。

関連する問題