0

自動インクリメントtestTableと.idsomeValue

someValue列に含まれるデータは次のとおりです。12, 1.2, .4, 1d4, +, -, .

のデータ型はsomeValueですvarchar(50)

次のクエリがスローされるのはなぜですか

データ型 varchar から数値への変換中にエラーが発生しました。

select ID, someValue 
from testTable 
where ISNUMERIC(someValue + 'd0') = 1 and CAST(someValue as decimal(8,2)) > 0.1;

select tt.ID,tt.someValue 
from (select ID, someValue 
      from testTable 
      where ISNUMERIC(someValue + 'd0') = 1) as tt 
where CAST(tt.someValue as decimal(8,2)) > 0.1;
4

2 に答える 2

1

いくつか問題があります。CAST10 進数以外の入力では機能せずISNUMERIC、'-'、'.'、'US$100' などの 10 進数以外の値を含む、金額に変換できる文字列を受け入れます。

これを解決する正しい方法はDecimal、データベースに列を追加し、比較したい値を列someValueに入力するために入力するものをすべて用意し、Decimal列に対してのみ比較することですDecimal

何らかの理由でそれができない場合は、ISNUMERIC通貨以外の小数の金額のみを使用して含めることができ、Convert代わりにCAST次のように使用できます。

select ID, someValue 
from testTable 
where ID IN
    (select ID from testTable where ISNUMERIC(someValue) = 1
    AND Patindex('%[^0-9-+.]%', someValue) = 0
    AND someValue NOT IN ('-', '+', '.')
    )
    and Convert(decimal, someValue) > 0.1
于 2013-01-29T01:15:10.457 に答える
0

最初のステートメントでは、から直接取得しtestTableて試行します。

CAST(someValue as  decimal(8,2))

数値以外の値を除外していないため、これはエラーをスローします。

于 2013-01-28T16:59:59.907 に答える