Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Lançando notação científica (de varchar -> numeric) em uma visão


Há alguns problemas diferentes, todos se juntando aqui ao mesmo tempo. Vejamos alguns deles:

  1. Você está lançando números como DECIMAL(18, 18). O que isso significa é "me dê um número que tenha espaço para um TOTAL de 18 caracteres, e 18 deles devem estar após o decimal". Isso funciona bem desde que seu número seja menor que 0 (o que é verdade para todos os números E), mas ele será interrompido se você tentar usá-lo em números> 0. Para números> 0, apenas converta como DECIMAL sem especificar mais nada .

  2. No caso em que você adiciona "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", você obtém resultados diferentes para números <0 porque o mecanismo está lançando implicitamente o resultado de maneira diferente. Eu não conheço as regras sobre como o sql server decide converter os resultados do CASE, mas aparentemente fazer sua alteração proposta faz com que o mecanismo o reformule de uma maneira diferente. A conversão explícita desses resultados como decimal corrige o problema.

  3. Você precisa LTRIM e RTRIM seus resultados de forma consistente. Você pode adicionar LTRIM e RTRIM a cada instrução case ou pode apenas LTRIM e RTRIM os resultados do caso.

Aqui está uma solução que deve resolver totalmente tudo:
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))