2016-10-28 10 views
1

10進数に変換する列があるので、それを使用してwhere節を比較することができます。私は、列のすべての値が1.3以上であることを確認したい。私はselect声明で正常に列を変換しますが、私は次のエラーを取得するwhere句で同じ変換を行うことをしようとしたとき:ケースステートメントを使用してvarcharを10進数に変換し、それをwhere句で使用できますか?

Arithmetic overflow error converting varchar to data type numeric.

私は、SQL Server 2008の

SELECT ID, 
    CASE 
     WHEN ISNUMERIC(USER_3) = 1 
      THEN Convert(varchar(50), CONVERT(decimal(14,2), USER_3)) 
     END AS KG_M 
FROM PART 
WHERE USER_3 IS NOT NULL 
     AND CASE 
      WHEN ISNUMERIC(USER_3) = 1 
       THEN Convert(varchar(50), CONVERT(decimal(14,2), USER_3)) 
      END >= 1.3 
+0

あなたは 'varchar'に変換しているので、'> = '1.3''を使うべきです – Lamak

+0

ああ、そういう小さな見落としは...ありがとう。申し訳ありませんが、偽の質問のために、私はそれが動作していたはずだった。私は構文エラーを考えていませんでした。 – Azuraith

+1

'USER_3'カラムにあるデータを表示できますか? 'ISNUMERIC'は信頼できません –

答えて

0

に問題を使用しています構文エラーでした。where句の場合は、全体的に成功していました。

コメント

1

に@Lamakにクレジットをあなたが変換する1つの方法を選択する必要があり、「あなたはVARCHARに変換しているので、> = 『1.3』を使用しなければなりません」。私は比較のために、ネイティブタイプを10進数で使用します。

SELECT * FROM 
(
    SELECT ID, KG_M=CAST(USER_3 AS decimal(14,2)) 
    FROM PART 
    WHERE 
     ISNUMERIC(USER_3) = 1 
)AS X 
WHERE 
    X.KG_M >= 1.3 

なぜ

SELECT * FROM 
(
    SELECT 
     ID, 
     USER_3_AsDecimal=CASE WHEN ISNUMERIC(USER_3) THEN CAST(USER_3 AS decimal(14,2)) ELSE NULL END, 
     USER_3 
    FROM PART 
    WHERE 
     NOT USER_3 IS NULL 
)AS X 
WHERE 
    X.USER_3_AsDecimal IS NULL 
    OR 
    X.USER_3_AsDecimal >= 1.3 
+0

だから、user_ID = 'TEST'と言うとnullチェックに失敗します。問合せの出力には2つのデータ型を持つKG_Mという列があります。私は、SQLサーバーは、不平を言うだろうと思いますか?結果セットに1つの列に対して2つのデータ型があるとは思わなかった。おそらく暗黙のうちに小数をvarcharにキャストしますが、私はそうは思わないでしょう。 – xQbert

+0

ISNUMERIC = 1がその場所で使用されている場合は、すべての文字列値が数値であることを保証することができ、安全に10進数に変換できます。 –

+0

それはそうするべきです。ただし、(エラーに基づいて)ユーザー_3フィールドにガベージ/予期しないデータが原因で後続のデータが削除されることがあります。 – xQbert

2

確かoutoput内の数値でない文字列を、許可しますか?ここで自己完結型の例です:

select a.ID 
    , b.KG_M 
from (values 
    (1, N'12345678') 
    , (2, N'ABCDEFGH') 
) as a (ID, USER_3) 
cross apply (values(
    case IsNumeric(a.USER_3) 
     when 1 then Convert(varchar(50), Convert(decimal(14, 2), a.USER_3)) 
     else a.USER_3 
    end 
)) as b (KG_M) 
where b.KG_M >= '1.3'; 

我々は、単に、後で再利用するために私たちの計算を含むようにAPPLY演算子を使用します。

関連する問題