Mamy tu do czynienia z kilkoma różnymi problemami w tym samym czasie. Przyjrzyjmy się niektórym z nich:
-
Rzucasz liczby jako DECIMAL(18, 18). Oznacza to, że „daj mi liczbę, która ma miejsce na ŁĄCZNIE 18 znaków, a 18 z nich powinno być po przecinku”. Działa to dobrze, o ile twoja liczba jest mniejsza niż 0 (co jest prawdziwe dla wszystkich liczb E), ale zepsuje się, jeśli spróbujesz użyć jej na liczbach> 0. Dla liczb> 0, po prostu rzucaj jako DZIESIĘTNY bez określania czegokolwiek innego .
-
W przypadku dodania „WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)” otrzymujesz różne wyniki dla liczb <0, ponieważ silnik niejawnie rzutuje wynik w inny sposób. Nie znam zasad, w jaki sposób serwer sql decyduje się na rzutowanie wyników CASE, ale najwyraźniej wprowadzenie proponowanej zmiany powoduje, że silnik przerzuca ją w inny sposób. Jawne rzutowanie tych wyników jako dziesiętne rozwiązuje problem.
-
Musisz konsekwentnie LTRIM i RTRIM swoje wyniki. Możesz dodać LTRIM i RTRIM do każdej instrukcji sprawy lub możesz po prostu LTRIM i RTRIM wyniki sprawy.
Oto rozwiązanie, które powinno całkowicie rozwiązać wszystko:
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))