Det finns ett par olika problem som alla möts här samtidigt. Låt oss titta på några av dem:
-
Du castar siffror som DECIMAL(18, 18). Vad det betyder är "ge mig ett nummer som har plats för TOTALT 18 tecken, och 18 av dem ska vara efter decimalen". Det fungerar bra så länge ditt nummer är mindre än 0 (vilket är sant för alla E-nummer) men det kommer att gå sönder om du försöker använda det på nummer> 0. För nummer> 0, cast bara som DECIMAL utan att ange något annat .
-
I fallet där du lägger till "NÄR @d gillar '%E+%' THEN CAST(@d AS FLOAT)", får du olika resultat för siffror <0 eftersom motorn implicit castar resultatet annorlunda. Jag känner inte till reglerna för hur sql-servern bestämmer sig för att casta CASE-resultat, men uppenbarligen gör din föreslagna ändring att motorn gör om den på ett annat sätt. Att explicit casta dessa resultat som decimaler löser problemet.
-
Du måste LTRIM och RTRIM dina resultat konsekvent. Du kan antingen lägga till LTRIM och RTRIM till varje fallbeskrivning, eller så kan du bara LTRIM och RTRIM resultatet av ärendet.
Här är en lösning som borde lösa allt:
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))