Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Casting Scientific Notation (von varchar -> numeric) in einer Ansicht

Es gibt ein paar verschiedene Probleme, die hier alle gleichzeitig zusammenkommen. Sehen wir uns einige davon an:

  1. Sie geben Zahlen als DECIMAL(18, 18) aus. Was das bedeutet, ist "geben Sie mir eine Zahl, die Platz für insgesamt 18 Zeichen hat, und 18 davon sollten nach dem Komma stehen". Das funktioniert gut, solange Ihre Zahl kleiner als 0 ist (was für alle E-Zahlen gilt), aber es wird brechen, wenn Sie versuchen, es auf Zahlen> 0 zu verwenden. Für Zahlen> 0, einfach als DECIMAL umwandeln, ohne etwas anderes anzugeben .

  2. In dem Fall, in dem Sie "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)" hinzufügen, erhalten Sie unterschiedliche Ergebnisse für Zahlen <0, da die Engine das Ergebnis implizit anders umwandelt. Ich kenne die Regeln nicht, wie SQL Server entscheidet, CASE-Ergebnisse umzuwandeln, aber anscheinend führt Ihre vorgeschlagene Änderung dazu, dass die Engine sie auf andere Weise neu umwandelt. Das explizite Umwandeln dieser Ergebnisse in Dezimalzahlen behebt das Problem.

  3. Sie müssen Ihre Ergebnisse konsistent LTRIM und RTRIM machen. Sie können entweder LTRIM und RTRIM zu jeder Case-Anweisung hinzufügen oder einfach die Ergebnisse des Falls LTRIM und RTRIM hinzufügen.

Hier ist eine Lösung, die alles vollständig lösen sollte:

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))