4

昨日、SQL Server で興味深い問題が見つかりました。これを試してください。

DECLARE @a REAL = 0.0000
DECLARE @c DECIMAL (18,10) = 20754/3.45 -- this is 6015.6521730000
DECLARE @b DECIMAL (18,10) = 
CASE 
    WHEN 1 > 2 
        THEN @a / 100
    WHEN 1 = 2
        THEN 56
    ELSE @c
END

SELECT @b

精度の問題と、case ステートメントのコンパイル方法に問題があるようです。これは、case ステートメントで REAL @a を 10 進数にキャストすることで簡単に解決できますが、返されるのは @c であり、他のケースは決してヒットしないため、遭遇するのは奇妙な問題です。これを説明するためにSQLコンパイルについて十分に知っている人はいますか?

4

2 に答える 2

3

ドキュメントで詳しく説明されているように、データ型の優先順位に依存します

[CASE]result_expressionsおよびオプションのelse_result_expressionの型のセットから最も優先度の高い型を返します。

http://msdn.microsoft.com/en-us/library/ms181765(v=sql.100).aspx

行を追加することで完全に壊すことができます

WHEN 1 = 3 then getdate()

ここにもっと詳細な説明があります

コンパイラーは、すべてのケースが可能であると想定していると思います(もちろん、あなたの例は意図的にひねくれています:))

于 2012-10-18T08:39:21.563 に答える
0

これは間違った答えです。正しい答えについては、podiluska の答えを参照してください。

case ステートメントの結果の型は、最初のthen句の型です。そう:

CASE 
    WHEN 1 > 2 
        THEN @a / 100

結果をacaseの型にします。これを次のように変更します。@areal

CASE 
    WHEN 1 > 2 
        THEN cast(@a as decima(18,10)) / 100

として結果を取得しdecimal(18,10)ます。

于 2012-10-18T08:34:04.900 に答える