Има няколко различни проблема, които се събират тук едновременно. Нека да разгледаме някои от тях:
-
Вие въвеждате числа като DECIMAL(18, 18). Това означава "дайте ми число, което има място за ОБЩО 18 знака, като 18 от тях трябва да са след десетичната запетая". Това работи добре, стига вашето число да е по-малко от 0 (което е вярно за всички E-числа), но ще се повреди, ако се опитате да го използвате върху числа> 0. За числа> 0, просто прехвърлете като DECIMAL, без да указвате нищо друго .
-
В случай, че добавите "КОГАТО @d като '%E+%' THEN CAST(@d AS FLOAT)", вие получавате различни резултати за числа <0, защото двигателят имплицитно прехвърля резултата по различен начин. Не знам правилата за това как sql сървърът решава да преобразува резултатите от CASE, но очевидно извършването на предложената от вас промяна кара двигателя да го преработи по различен начин. Изричното предаване на тези резултати като десетични знаци решава проблема.
-
Трябва последователно да LTRIM и RTRIM резултатите си. Можете или да добавите LTRIM и RTRIM към всеки оператор на случай, или можете просто да 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))