sql >> Base de Datos >  >> RDS >> Sqlserver

Casting Scientific Notation (desde varchar -> numérico) en una vista

Hay un par de problemas diferentes, todos juntos aquí al mismo tiempo. Veamos algunos de ellos:

  1. Estás lanzando números como DECIMAL (18, 18). Lo que eso significa es "dame un número que tenga espacio para un TOTAL de 18 caracteres, y 18 de ellos deben estar después del decimal". Eso funciona bien siempre que su número sea menor que 0 (lo cual es cierto para todos los números E), pero se romperá si intenta usarlo en números> 0. Para números> 0, simplemente emita como DECIMAL sin especificar nada más .

  2. En el caso de que agregue "CUANDO @d como '%E+%' ENTONCES CAST(@d AS FLOAT)", obtendrá resultados diferentes para números <0 porque el motor implícitamente emite el resultado de manera diferente. No conozco las reglas sobre cómo el servidor sql decide lanzar los resultados de CASE, pero aparentemente hacer el cambio propuesto hace que el motor lo reformule de una manera diferente. Convertir explícitamente esos resultados en decimales soluciona el problema.

  3. Necesita LTRIM y RTRIM sus resultados consistentemente. Puede agregar LTRIM y RTRIM a cada declaración de caso, o puede simplemente LTRIM y RTRIM los resultados del caso.

Aquí hay una solución que debería resolver todo por completo:

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