ここには、いくつかの異なる問題が同時に発生しています。それらのいくつかを見てみましょう:
-
数値をDECIMAL(18、18)としてキャストしています。つまり、「合計18文字のスペースがある数値を教えてください。そのうち、18文字は小数点以下である必要があります」。数値が0未満(すべてのE番号に当てはまります)であれば問題なく動作しますが、0より大きい数値で使用しようとすると壊れます。0より大きい数値の場合は、他に何も指定せずにDECIMALとしてキャストするだけです。 。
-
「WHEN@d like'%E +%' THEN CAST(@d AS FLOAT)」を追加した場合、エンジンが暗黙的に結果を異なる方法でキャストしているため、0未満の数値に対して異なる結果が得られます。 SQL ServerがCASEの結果をキャストする方法についてのルールはわかりませんが、提案された変更を行うと、エンジンが別の方法でキャストし直すようになります。これらの結果を10進数として明示的にキャストすると、問題が修正されます。
-
結果を一貫してLTRIMおよびRTRIMする必要があります。 LTRIMとRTRIMを各caseステートメントに追加することも、LTRIMとRTRIMだけでケースの結果を追加することもできます。
すべてを完全に解決する必要があるソリューションは次のとおりです。
SELECT
LTRIM(RTRIM(CASE
WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
ELSE @d
END))