Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przesyłanie notacji naukowej (od varchar -> numeryczny) do widoku

Mamy tu do czynienia z kilkoma różnymi problemami w tym samym czasie. Przyjrzyjmy się niektórym z nich:

  1. Rzucasz liczby jako DECIMAL(18, 18). Oznacza to, że „daj mi liczbę, która ma miejsce na ŁĄCZNIE 18 znaków, a 18 z nich powinno być po przecinku”. Działa to dobrze, o ile twoja liczba jest mniejsza niż 0 (co jest prawdziwe dla wszystkich liczb E), ale zepsuje się, jeśli spróbujesz użyć jej na liczbach> 0. Dla liczb> 0, po prostu rzucaj jako DZIESIĘTNY bez określania czegokolwiek innego .

  2. W przypadku dodania „WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)” otrzymujesz różne wyniki dla liczb <0, ponieważ silnik niejawnie rzutuje wynik w inny sposób. Nie znam zasad, w jaki sposób serwer sql decyduje się na rzutowanie wyników CASE, ale najwyraźniej wprowadzenie proponowanej zmiany powoduje, że silnik przerzuca ją w inny sposób. Jawne rzutowanie tych wyników jako dziesiętne rozwiązuje problem.

  3. Musisz konsekwentnie LTRIM i RTRIM swoje wyniki. Możesz dodać LTRIM i RTRIM do każdej instrukcji sprawy lub możesz po prostu LTRIM i RTRIM wyniki sprawy.

Oto rozwiązanie, które powinno całkowicie rozwiązać wszystko:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można połączyć się z bazą danych SQLServer w aplikacji Java

  2. Jak wyświetlić kolumnę wyników zapytania (w różnych kolumnach) zamiast wiersz po wierszu?

  3. Konwersja typu danych datetime2 na typ danych smalldatetime skutkowała wartością spoza zakresu.\r\nInstrukcja została zakończona

  4. Liczby dni tygodnia w zakresie dat w TSQL

  5. Jak zachować kolejność wstawiania w SQL Server