sql >> Database >  >> RDS >> Sqlserver

Wetenschappelijke notatie casten (van varchar -> numeriek) in een weergave

Er zijn een paar verschillende problemen die hier allemaal tegelijkertijd samenkomen. Laten we er een paar bekijken:

  1. Je cast nummers als DECIMAAL (18, 18). Wat dat betekent is "geef me een nummer dat ruimte heeft voor een TOTAAL van 18 tekens, en 18 daarvan moeten achter de komma staan". Dat werkt prima zolang je getal kleiner is dan 0 (wat geldt voor alle E-nummers) maar het zal breken als je het probeert te gebruiken op getallen> 0. Voor getallen> 0, cast gewoon als DECIMAAL zonder iets anders op te geven .

  2. In het geval dat je "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)" toevoegt, krijg je verschillende resultaten voor getallen <0 omdat de engine het resultaat impliciet anders cast. Ik ken de regels niet over hoe de sql-server beslist om CASE-resultaten te casten, maar blijkbaar zorgt het maken van uw voorgestelde wijziging ervoor dat de engine deze op een andere manier herschikt. Het expliciet casten van die resultaten als decimaal lost het probleem op.

  3. U moet uw resultaten consistent LTRIM en RTRIM maken. U kunt ofwel LTRIM en RTRIM toevoegen aan elke case-statement, of u kunt alleen LTRIM en RTRIM de resultaten van de case toevoegen.

Hier is een oplossing die alles volledig zou moeten oplossen:

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. Opeenvolgende goede praktijk van PreparedStatement

  2. Datum en tijd bijwerken in MySQL via python

  3. Crypt() saltgeneratie en wachtwoordcodering, goed uitgevoerd?

  4. PostgreSQL, trigrammen en gelijkenis