0

これは私たちを当惑させました...

CAST を使用して float を decimal に変換するクエリがあります。このクエリは、多数のテーブルを結合して、返される行を見つけます。テーブルの 1 つの行の 1 つに、10 進数への CAST で算術オーバーフロー エラーが発生する値が含まれています。

奇妙なことに、この値を持つ行は、結果セットで返される行の 1 つではありません。

非常に単純化された例:

ID  Value
1   1.1
2   11.1
3   11111.1

クエリ:

SELECT Id, CAST(value as decimal(4,1))
FROM <complex number of joins>
WHERE <conditions that don't return row with Id 3>

... 算術エラー

WHERE 句でその行を明示的に除外すると、エラーはなくなります。例えば。WHERE ... AND ID <> 3

.. 正常に動作します

これがどのように可能か知っている人はいますか?

注: ここでの問題は、CAST が ID 3 の行で失敗することではありません! 問題は、WHERE 句が ID 3 の行を除外しているにもかかわらず、クエリが失敗することです。値が 11111.1 の行が WHERE 句によって返されない場合、クエリはどのように失敗するのでしょうか?

4

3 に答える 3

0

DECIMAL(4, 1)は合計 4 桁の精度を意味し、そのうちの1 つは小数点以下の桁数です。したがって、値に対応するには11111.1、少なくとも が必要ですDECIMAL(6, 1)。次のクエリが機能するはずです。

SELECT Id, CAST(value AS DECIMAL(6,1))
FROM <complex number of joins>
WHERE <conditions that don't return row with Id 3>

少なくとも、上記は、提供した 3 つのサンプル データに対して機能します。

デモ

于 2020-01-17T05:00:57.517 に答える