56

値が整数かどうかを判断したい(TryParse.NETのように)。残念ながらISNUMERIC、すべての種類の数値ではなく整数のみを解析したいので、私には合いません。ISINT何かあるの?

これは物事を明確にするためのいくつかのコードです。がintでない場合MY_FIELD、このコードは失敗します。

SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'

ありがとうございました

4

23 に答える 23

44

これは、 UDFの作成について説明しているブログ投稿です。IsInteger

基本的に'.e0'は、値を追加してを使用することをお勧めしIsNumericます。このように、すでに小数点があったものはすべて小数点が2つIsNumericになり、falseになります。また、科学的記数法ですでに表現されているものはすべて、によって無効になりe0ます。

于 2012-05-09T14:12:04.100 に答える
25

彼の記事で、この文字列を整数に変換できますか?、Itzik Ben-Ganは、純粋なT-SQLと、CLRを使用する別のソリューションを提供します。

どのソリューションを選択する必要がありますか?

T-SQLまたはCLRソリューションの方が優れていますか? T-SQLソリューションを使用する利点は、T-SQLプログラミングのドメインの外に出る必要がないことです。ただし、CLRソリューションには2つの重要な利点があります。それは、よりシンプルで高速です。1,000,000行のテーブルに対して両方のソリューションをテストしたところ、CLRソリューションの実行には(T-SQLソリューションの場合)7秒ではなく、2秒かかりました。したがって、次に特定の文字列を整数に変換できるかどうかを確認する必要がある場合は、この記事で提供したT-SQLまたはCLRソリューションを含めることができます。

T-SQLのみを保守する場合は、純粋なT-SQLソリューションを使用してください。利便性よりもパフォーマンスが重要な場合は、CLRソリューションを使用してください。

純粋なT-SQLソリューションには注意が必要です。組み込みのISNUMERIC関数をパターンマッチングおよびキャストと組み合わせて、文字列がintを表すかどうかをチェックします。

SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
  CASE
    WHEN ISNUMERIC(string) = 0     THEN 0
    WHEN string LIKE '%[^-+ 0-9]%' THEN 0
    WHEN CAST(string AS NUMERIC(38, 0))
      NOT BETWEEN -2147483648. AND 2147483647. THEN 0
    ELSE 1
  END AS is_int
FROM dbo.T1;

CLRソリューションのT-SQL部分はより単純です。ISNUMERICを呼び出すのと同じように、fn_IsInt関数を呼び出します。

SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
  dbo.fn_IsInt(string) AS is_int
FROM dbo.T1;

C#の部分は、.NETの解析関数Int32.TryParseの単なるラッパーです。これは、SQLServerintと.NETInt32が両方とも32ビットの符号付き整数であるために機能します。

using System;
using System.Data.SqlTypes;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean fn_IsInt(SqlString s)
    {
        if (s.IsNull)
            return SqlBoolean.False;
        else
        {
            Int32 i = 0;
            return Int32.TryParse(s.Value, out i);
        }
    }
};

これらのコードサンプルの完全な説明については、Itzikの記事をお読みください。

于 2012-05-09T14:46:45.983 に答える
19

sqlserver 2005以降では、LIKE演算子で正規表現のような文字クラスを使用できます。ここを参照してください。

文字列が負でない整数(10進数のシーケンス)であるかどうかを確認するには、他の文字が含まれていないことをテストできます。

SELECT numstr
  FROM table
 WHERE numstr NOT LIKE '%[^0-9]%'

注1:これも空の文字列を返します。

注2:を使用LIKE '%[0-9]%'すると、少なくとも1桁の文字列が返されます。

フィドルを見る

于 2015-07-16T20:40:57.570 に答える
10
WHERE IsNumeric(MY_FIELD) = 1 AND CAST(MY_FIELD as VARCHAR(5)) NOT LIKE '%.%'

それはおそらく最も簡単な解決策です。MY_FIELD.00またはそのようなものが含まれていない限り。その場合は、フロートにキャストして、末尾の.00を削除します。

于 2014-08-27T14:13:40.153 に答える
4

ネクロマンシング。
SQL-Server 2012以降では、TRY_CASTを使用できます。これは、キャストが成功しなかった場合にNULLを返します。

例:

DECLARE @foo varchar(200)
SET @foo = '0123' 
-- SET @foo = '-0123' 
-- SET @foo = '+0123' 
-- SET @foo = '+-0123' 
-- SET @foo = '+-0123' 
-- SET @foo = '.123' 
-- SET @foo = '1.23' 
-- SET @foo = '.' 
-- SET @foo = '..' 
-- SET @foo = '0123e10' 

SELECT CASE WHEN TRY_CAST(@foo AS integer) IS NULL AND @foo IS NOT NULL THEN 0 ELSE 1 END AS isInteger 

これが唯一の本当に信頼できる方法です。

SQL-Server 2008のサポートが必要な場合は、SamDeHaanの回答に戻ってください。

SELECT CASE WHEN ISNUMERIC(@foo + '.e0') = 1 THEN 1 ELSE 0 END AS isInteger 

SQL-Server <2012(別名2008R2)は、2019-07-09までに(拡張された)サポートの終了に達します。
間もなく開始される現時点では、<2012のサポートを終了することができます。
現時点では、他のハックは使用しません。
質素な顧客に更新するように伝えてください。2008年から10年以上が経過しています。

于 2019-02-26T12:42:08.117 に答える
3

以下のクエリが役立つかどうかを確認してください

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
于 2016-07-01T06:34:17.203 に答える
3

IsNumeric関数を使用したこの回避策は、次のように機能します。

select * from A where ISNUMERIC(x) =1 and X not like '%.%'

または使用する

select * from A where x **not like** '%[^0-9]%'

于 2017-09-12T11:22:39.667 に答える
3

WHERE条項については、次のとおりです。関数がそれをでラップするようにしCASE WHENます。

 ISNUMERIC(table.field) > 0 AND PATINDEX('%[^0123456789]%', table.field) = 0
于 2017-12-14T22:33:48.993 に答える
2
@iを宣言するnumeric(28,5)= 12.0001


if(@ i / cast(@i as int)> 1)
始める
    「これはintではありません」を選択します
終わり
そうしないと
始める
    'thisisint'を選択します
終わり
于 2016-04-06T10:32:10.773 に答える
2

SQL Server 2012の時点で、TRY_CONVERTおよびTRY_CAST関数が実装されました。これはソリューションを大幅に改善したISNUMERICものであり、誤検知(または誤検知)を引き起こす可能性があります(実際にそうなります)。たとえば、以下を実行する場合:

SELECT CONVERT(int,V.S)
FROM (VALUES('1'),
            ('900'),
            ('hello'),
            ('12b'),
            ('1.1'),
            ('')) V(S)
WHERE ISNUMERIC(V.S) = 1;

TRY_CONVERT(または)を使用すると、次のTRY_CASTことが回避されます。

SELECT TRY_CONVERT(int,V.S),
       V.S,
       ISNUMERIC(V.S)
FROM (VALUES('1'),
            ('900'),
            ('hello'),
            ('12b'),
            ('1.1'),
            ('')) V(S)
--WHERE TRY_CONVERT(int,V.S) IS NOT NULL; --To filter to only convertable values

'1.1'が返されることに注意してくださいNULL。これにより、前にエラーが発生します(10進数の文字列表現はに変換できないためint)が、値が「変換できません」と記載されていても、が''返されます。0ISNUMERIC

于 2019-03-07T17:09:48.050 に答える
1

データベースの設計に問題があると思います。varcharとnumbersを1つの列に混在させるのは本当に悪い考えだと思いますか?その理由は何ですか?

もちろん、[0-9]以外の文字があるかどうかを確認できますが、テーブルに1mの行があり、すべての行を確認していると想像してください。うまくいかないと思います。

とにかく、本当にやりたいのなら、クライアント側でやることをお勧めします。

于 2012-05-09T14:21:55.440 に答える
1

私はそれをこのようにすることは悪魔の仕事であると感じていますが、代わりに:

TRY-CATCHはどうですか?

DECLARE @Converted as INT
DECLARE @IsNumeric BIT

BEGIN TRY
    SET @Converted = cast(@ValueToCheck as int)
    SET @IsNumeric=1
END TRY
BEGIN CATCH
    SET @IsNumeric=0
END CATCH

select IIF(@IsNumeric=1,'Integer','Not integer') as IsInteger

これは、SQLServer2008以降でのみ機能します。

于 2017-05-17T12:08:23.993 に答える
1

このスクリプトを試して、答えを得ました

ISNUMERIC(Replace(Replace([enter_your_number],'+','A'),'-','A') + '.0e0')

たとえば、アップ質問の場合、これは答えです:

SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER' and ISNUMERIC(Replace(Replace(MY_FIELD,'+','A'),'-','A') + '.0e0') = 1
于 2021-01-09T12:20:49.070 に答える
0

次のようなことをしてみませんか。

CASE
WHEN ROUND(MY_FIELD,0)=MY_FIELD THEN CAST(MY_FIELD AS INT)
ELSE MY_FIELD
END
as MY_FIELD2
于 2014-07-08T21:21:34.323 に答える
0

データベースを設計できない場合もあります。与えられたものを使用するだけです。私の場合、それは私が読み取りアクセス権しか持っていないコンピューター上にあるデータベースであり、2008年以来存在しています。

設計が不十分なデータベースの列から選択する必要があります。このvarchar列の番号は1〜100ですが、ランダムな文字列である場合もあります。私はそれを回避するために以下を使用しました(データベース全体を再設計できればよかったのですが)。

SELECT A from TABLE where isnumeric(A)=1
于 2015-02-04T23:25:56.697 に答える
0

私はSQLのプロではありませんが、1で割り切れるかどうかを確認するのはどうですか?私にとってはそれが仕事をします。

SELECT *
FROM table    
WHERE fieldname % 1 = 0
于 2018-11-29T10:25:40.743 に答える
0

PATINDEXを使用する

DECLARE @input VARCHAR(10)='102030.40'
SELECT PATINDEX('%[^0-9]%',RTRIM(LTRIM(@input))) AS IsNumber

http://www.intellectsql.com/post-how-to-check-if-the-input-is-numeric/を参照して ください

于 2018-12-19T04:44:08.173 に答える
0

.NETのTryParseのSQL代替であるTRY_CONVERTを使用します。IsNumeric()は、空の文字列が(整数)ゼロとしてカウントされ、一部の完全に有効な通貨記号自体が(お金)ゼロに変換されないことを認識していません。参照

SELECT @MY_VAR = CASE WHEN TRY_CONVERT(INT,MY_FIELD) IS NOT NULL THEN MY_FIELD
                 ELSE 0
                 END
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
于 2020-05-21T18:42:48.097 に答える
0

同じ質問がありました。ついに使った

where ATTRIBUTE != round(ATTRIBUTE)

そしてそれは私のために働いた

于 2020-08-06T00:28:10.547 に答える
0
WHERE IsNumeric(value + 'e0') = 1 AND CONVERT(FLOAT, value) BETWEEN -2147483648 AND 2147483647
于 2020-12-02T22:30:22.120 に答える
0

これはかなり古いので、私の解決策はここにありません。これを行うための別の可能な方法を追加しようと思いました。

  --This query only returns values with decimals
  SELECT ActualCost
  FROM TransactionHistory
  where  cast(ActualCost as int) != ActualCost

  --This query only returns values without decimals
  SELECT ActualCost
  FROM TransactionHistory
  where  cast(ActualCost as int) = ActualCost

ここでの簡単な部分は、整数としてキャストしたときに選択した値が同じであるかどうかを確認することです。

于 2022-03-04T13:36:32.557 に答える
-1

これはSQLServerで正常に機能します

SELECT(SELECT ISNUMERIC(2)WHERE ISNUMERIC(2)= 1 AND 2 NOT LIKE'%。%')

于 2019-03-01T05:51:01.433 に答える
-1

Case
When (LNSEQNBR / 16384)%1 = 0 then 1 else 0 end

于 2020-02-21T20:08:10.120 に答える