none
データ型 varchar を float に変換中にエラーについて RRS feed

  • 質問

  • お世話になります。

    タイトルのエラーが解決できずに困っています。ご協力ください。エラーの詳細を下記に示します。

    Table1に AValue varchar(15) というFieldにデータ値'7.1'

    Table2に BValue varchar(10) というFieldにデータ値'13.0'、CValue varchar(10) というFieldにデータ値'8.7'

    といったデータを抽出する際に

    WHERE   ((convert(float,AValue) < convert(float,BValue))OR (convert(float,AValue) > convert(float,CValue)))

    上記の条件で抽出しようとすると表題のエラーがでます。

    データは同じ数値のデータが複数件ありますが、同じデータ状況にも関わらずエラーになる場合とならない場合があります。

    何か解決策がありましたら、お教えください。よろしくお願いします。

    SQLSever2008R2

    2011年3月31日 9:20

回答

  • SELECT DISTINCT CValue FROM table1;

    などとして、各値に含まれているすべての内容が変換可能か調べてみてください。

    同じデータでエラーになったりならなかったりというのは、これ以外の別の条件があったりして、エラーとなるデータが該当していないとかはないですか?

    たとえば、ここに記載されていない DValue を使用して (...) AND (DValue = 1) などとしていた場合、DValue が 1 のデータは正常に変換できるが、 (...) AND (DValue = 2) となって、DValue が 2 の時に対象となった場合に変換できない文字列が含まれている…とかですね。(この場合、DValue のインデックス等によってエラーとなる AValue, BValue, CValue がまったく評価されない場合があります)

     

    • 回答としてマーク 山本春海 2011年4月11日 7:33
    2011年3月31日 9:39
  • -- 1)
    SELECT CONVERT(float, AValue), CONVERT(float, BValue), CONVERT(float, CValue) FROM table1

    -- 2)
    SELECT なんとかかんとか FROM table1 WHERE (AValue, BValue, CValue を CONVERT して比較);

    この2つで比較して、1) は成功するが 2) は変換エラーになっているということですね?

    SELECT NULL FROM table1 WHERE  (AValue, BValue, CValue を CONVERT して比較);

    が変換エラーにならないようなら、SELECT に記載してる列リスト側でエラーになっているのかもしれませんね。逆に、これがエラーになるようですとインデックスや統計情報を再構築してみるとかで改善したりするかもしれませんね。

    • 回答としてマーク 山本春海 2011年4月11日 7:33
    2011年3月31日 14:58

すべての返信

  • SELECT DISTINCT CValue FROM table1;

    などとして、各値に含まれているすべての内容が変換可能か調べてみてください。

    同じデータでエラーになったりならなかったりというのは、これ以外の別の条件があったりして、エラーとなるデータが該当していないとかはないですか?

    たとえば、ここに記載されていない DValue を使用して (...) AND (DValue = 1) などとしていた場合、DValue が 1 のデータは正常に変換できるが、 (...) AND (DValue = 2) となって、DValue が 2 の時に対象となった場合に変換できない文字列が含まれている…とかですね。(この場合、DValue のインデックス等によってエラーとなる AValue, BValue, CValue がまったく評価されない場合があります)

     

    • 回答としてマーク 山本春海 2011年4月11日 7:33
    2011年3月31日 9:39
  • ご回答ありがとうございます。

    条件としては

    WHERE   ((convert(float,AValue) < convert(float,BValue))OR (convert(float,AValue) > convert(float,CValue)))

    この条件でのみです。また、条件を外して抽出されるデータのSELECT句に Convert(float,AValue) AS AValue、Convert(float,BValue) AS BValue、Convert(float,CValue) AS CValue として変換する場合は全てfloat型へと変換されます。

    やはり他のSELECTしてるFieldによって引き起こされているかもしれませんね。そこを検証してみます。

    検証結果後、ご報告させていただきます。ありがとうございました。

    2011年3月31日 10:15
  • -- 1)
    SELECT CONVERT(float, AValue), CONVERT(float, BValue), CONVERT(float, CValue) FROM table1

    -- 2)
    SELECT なんとかかんとか FROM table1 WHERE (AValue, BValue, CValue を CONVERT して比較);

    この2つで比較して、1) は成功するが 2) は変換エラーになっているということですね?

    SELECT NULL FROM table1 WHERE  (AValue, BValue, CValue を CONVERT して比較);

    が変換エラーにならないようなら、SELECT に記載してる列リスト側でエラーになっているのかもしれませんね。逆に、これがエラーになるようですとインデックスや統計情報を再構築してみるとかで改善したりするかもしれませんね。

    • 回答としてマーク 山本春海 2011年4月11日 7:33
    2011年3月31日 14:58
  • Takaoka様がおっしゃる通り1)、は成功 2)、はエラーです。

    SELECT NULL FROM table1 WHERE  (AValue, BValue, CValue を CONVERT して比較);

    の方を試してみましたが、同様のエラーでした。

    ここでtable1 としている内容が、複数のテーブルをJoinしていることと、他の重要なプログラムでも使用していることもあって、インデックスの変更とかは難しい状況です。

    今回は、WHERE  (AValue, BValue, CValue)をSQLからは外して、プログラム内で制御することにしました。

    重ね重ねご指南頂き、とても助かりました。ありがとうございます。

    2011年4月1日 2:19