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

Støbning af videnskabelig notation (fra varchar -> numerisk) i en visning

Der er et par forskellige problemer, der alle samles her på samme tid. Lad os se på nogle af dem:

  1. Du caster tal som DECIMAL(18, 18). Hvad det betyder er "giv mig et tal, der har plads til i alt 18 tegn, og 18 af dem skal stå efter decimalen". Det fungerer fint, så længe dit tal er mindre end 0 (hvilket er sandt for alle E-numre), men det går i stykker, hvis du prøver at bruge det på tal> 0. For tal> 0 skal du bare kaste som DECIMAL uden at angive noget andet .

  2. I det tilfælde, hvor du tilføjer "NÅR @d kan lide '%E+%' THEN CAST(@d AS FLOAT)", får du forskellige resultater for tal <0, fordi motoren implicit caster resultatet anderledes. Jeg kender ikke reglerne for, hvordan sql-serveren beslutter sig for at caste CASE-resultater, men tilsyneladende vil din foreslåede ændring få motoren til at recaste den på en anden måde. Eksplicit casting af disse resultater som decimaler løser problemet.

  3. Du skal LTRIM og RTRIM dine resultater konsekvent. Du kan enten føje LTRIM og RTRIM til hver sagsudsagn, eller du kan bare LTRIM og RTRIM resultaterne af sagen.

Her er en løsning, der fuldstændig burde løse alt:

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


  1. MySQL regexp meget langsom end gerne

  2. Indsæt flere rækker med samme primærnøgle i sql ved hjælp af php

  3. Hvordan kan jeg samle forbindelser ved hjælp af psycopg og gevent?

  4. MySQL hvordan får man værdi til at udløbe?