1

フィルタが適用されるときに常に数値(10進数)を含む必要があるvarcharフィールドがあります。しかし、次のようにSQLを実行すると、「データ型varcharから数値への変換エラー」が発生します。

SELECT CAST(A.text AS numeric(38,16)) 
FROM Answers A
INNER JOIN Questions Q ON Q.ID = A.QuestionID
WHERE Q.Text = 'Rating'
AND isnumeric(A.text) = 1

isnumericテストに合格したが、キャストに失敗した値は1つだけです。

DECLARE @text varchar(100)
SET @text = '2.83417869359255E-02'
SELECT CASE WHEN ISNUMERIC(@text) = 1 THEN CAST(@text AS NUMERIC(38,16)) ELSE NULL END

このような値が処理されるようにするにはどうすればよいですか?1日の終わりに、5未満のすべての値をカウントしたいので、「2.83417869359255E-02」のような数値はゼロに丸めることができます。また、クエリを実行して、テーブル内の値とvarcharの長さを調べ、次の結果を取得しました。

MaxValue             MinValue             LenVarChar
-------------------- -------------------- -----------
0                    0                    1
10                   10                   2
2.2                  9.2                  3
3.55                 6.32                 4
5.453125             5.453125             8
2.79989361763        9.47216796875        13
2.089115858078       9.132080078125       14
1.1529632806778      9.8538990020752      15
0.64174896478653     9.83681106567383     16
0.111961431801319    0.991760730743408    17
2.83417869359255E-02 2.83417869359255E-02 20
4

1 に答える 1

1

数値を文字列として保存しないことが私の好ましい解決策ですが、いつでもDorEをチェックしてから float にキャストすることができます。

DECLARE @text VARCHAR(100)

SET @text = '2.83417869359255E-02'

SELECT
    CASE
    WHEN ISNUMERIC(@text) = 1
    THEN      CASE 
              WHEN @text LIKE '%[DE]%' 
              THEN CAST(CAST(@text AS FLOAT) AS NUMERIC(38, 16))
              ELSE @text
              END 
    END 

ただし、潜在的に問題のある入力がまだあります$ISNUMERICテストには合格しますが、へのキャストが必要になりますmoney

于 2013-01-23T10:25:24.287 に答える