Der er et par forskellige problemer, der alle samles her på samme tid. Lad os se på nogle af dem:
-
Du caster tal som DECIMAL(18, 18). Hvad det betyder er "giv mig et tal, der har plads til i alt 18 tegn, og 18 af dem skal stå efter decimalen". Det fungerer fint, så længe dit tal er mindre end 0 (hvilket er sandt for alle E-numre), men det går i stykker, hvis du prøver at bruge det på tal> 0. For tal> 0 skal du bare kaste som DECIMAL uden at angive noget andet .
-
I det tilfælde, hvor du tilføjer "NÅR @d kan lide '%E+%' THEN CAST(@d AS FLOAT)", får du forskellige resultater for tal <0, fordi motoren implicit caster resultatet anderledes. Jeg kender ikke reglerne for, hvordan sql-serveren beslutter sig for at caste CASE-resultater, men tilsyneladende vil din foreslåede ændring få motoren til at recaste den på en anden måde. Eksplicit casting af disse resultater som decimaler løser problemet.
-
Du skal LTRIM og RTRIM dine resultater konsekvent. Du kan enten føje LTRIM og RTRIM til hver sagsudsagn, eller du kan bare LTRIM og RTRIM resultaterne af sagen.
Her er en løsning, der fuldstændig burde løse alt:
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))