Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Casting Scientific Notation (da varchar -> numerico) in una vista

Ci sono un paio di problemi diversi che si incontrano qui allo stesso tempo. Diamo un'occhiata ad alcuni di loro:

  1. Stai lanciando numeri come DECIMAL(18, 18). Ciò significa "dammi un numero che ha spazio per un TOTALE di 18 caratteri e 18 di questi dovrebbero essere dopo il decimale". Funziona bene finché il tuo numero è inferiore a 0 (che è vero per tutti i numeri E) ma si interromperà se provi a usarlo su numeri> 0. Per numeri> 0, lancia come DECIMAL senza specificare nient'altro .

  2. Nel caso in cui aggiungi "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", ottieni risultati diversi per i numeri <0 perché il motore sta implicitamente trasmettendo il risultato in modo diverso. Non conosco le regole su come sql server decide di trasmettere i risultati CASE, ma a quanto pare apportare la modifica proposta fa sì che il motore lo riformi in un modo diverso. Il cast esplicito di questi risultati come decimali risolve il problema.

  3. Devi LTRIM e RTRIM i tuoi risultati in modo coerente. Puoi aggiungere LTRIM e RTRIM a ciascuna istruzione del caso, oppure puoi semplicemente LTRIM e RTRIM i risultati del caso.

Ecco una soluzione che dovrebbe risolvere completamente tutto:

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