Je tu několik různých problémů, které se tu spojují najednou. Podívejme se na některé z nich:
-
Čísla přenášíte jako DECIMAL(18, 18). To znamená "dej mi číslo, které má místo pro CELKOM 18 znaků a 18 z nich by mělo být za desetinnou čárkou". Funguje to dobře, pokud je vaše číslo menší než 0 (což platí pro všechna E-čísla), ale pokud se jej pokusíte použít na čísla> 0, přestane se zobrazovat. Pro čísla> 0 stačí přetypovat jako DECIMAL, aniž byste zadali cokoli jiného. .
-
V případě, že přidáte "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", dostanete pro čísla <0 různé výsledky, protože engine implicitně přehazuje výsledek jinak. Neznám pravidla o tom, jak se server SQL rozhodne přenášet výsledky CASE, ale provedení vámi navrhované změny zjevně způsobí, že je motor přetypuje jiným způsobem. Problém vyřeší explicitní přetypování těchto výsledků jako desítkové.
-
Své výsledky musíte důsledně LTRIM a RTRIM. Můžete buď přidat LTRIM a RTRIM ke každému příkazu případu, nebo můžete pouze LTRIM a RTRIM výsledky případu.
Zde je řešení, které by mělo vyřešit úplně všechno:
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))