1. ホーム
  2. sql

[解決済み] varchar を numeric データ型に変換する際の算術オーバーフローエラーです。'10' <= 9.00

2022-03-07 14:21:49

質問

以下は、私が扱っているテーブル構造とデータの種類を示すサブセットです。

CREATE TABLE #Test
(
     Val varchar(5)
    ,Type varchar(5)
)

INSERT #Test VALUES ('Yes','Text')
INSERT #Test VALUES ('10','Int')
INSERT #Test VALUES ('10.00','Float')
INSERT #Test VALUES ('9.00','Float')
INSERT #Test VALUES ('9','Int')

列 'Val' が <= 9.00 (数値データ型でなければならない) であるかどうかを知らせるクエリを書きたいのです。私は次のようにしてこれを行いました。

SELECT *
FROM
    (
        SELECT Val
        FROM #Test
        WHERE Type = 'Int'
    ) IntsOnly
WHERE IntsOnly.Val <= 9.00

これでは算術オーバーフローエラーが発生します。しかし、値「10」のデータ行を除外すると

SELECT *
FROM
    (
        SELECT Val
        FROM #Test
        WHERE Type = 'Int'
        AND Val <> '10'
    ) IntsOnly
WHERE IntsOnly.Val <= 9.00

問題なく動作しています。 私の質問は、単に私が必要とする形式にデータを変換することができることを知っているので、これを修正する方法ではない。

私の質問は、列 'Val' の値 '10' がなぜエラーを返しているのかということです。確かにロジックは 'False' を返して、'10' (暗黙のうちに変換されていると思いますが) が 9.00 より大きいので行を除外するだけでよいのですが。

ありがとうございます。

解決方法は?

を暗黙のうちにキャストしようとしているため、算術オーバーフローを発生させます。 Val カラムをNUMERIC(3,2)に変換するのですが、当然10などの2桁の値ではオーバーフローしてしまいます。

NUMERIC(3,2)をターゲット型とサイズとして使用しているのは、NUMERIC(3,2)が最も小さい数値であるためです。 9.00 に収まるように見える。

もちろん、解決策は、暗黙のうちに行うのではなく、明示的なCASTを使用することです。