Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Casting de la notation scientifique (de varchar -> numérique) dans une vue

Il y a quelques problèmes différents qui se rejoignent ici en même temps. Examinons-en quelques-uns :

  1. Vous lancez des nombres en tant que DECIMAL (18, 18). Cela signifie "donnez-moi un nombre qui a de la place pour un TOTAL de 18 caractères, et 18 d'entre eux doivent être après la virgule". Cela fonctionne bien tant que votre nombre est inférieur à 0 (ce qui est vrai pour tous les nombres E), mais il se cassera si vous essayez de l'utiliser sur des nombres> 0. Pour les nombres> 0, transmettez simplement DECIMAL sans rien spécifier d'autre .

  2. Dans le cas où vous ajoutez "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", vous obtenez des résultats différents pour les nombres <0 car le moteur diffuse implicitement le résultat différemment. Je ne connais pas les règles sur la façon dont le serveur sql décide de diffuser les résultats de CASE, mais apparemment, la modification de votre proposition oblige le moteur à la rediffuser d'une manière différente. Transmettre explicitement ces résultats en décimal résout le problème.

  3. Vous devez LTRIM et RTRIM vos résultats de manière cohérente. Vous pouvez soit ajouter LTRIM et RTRIM à chaque instruction de cas, soit simplement LTRIM et RTRIM les résultats du cas.

Voici une solution qui devrait totalement résoudre tout :

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