Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Прехвърляне на научна нотация (от varchar -> numeric) в изглед

Има няколко различни проблема, които се събират тук едновременно. Нека да разгледаме някои от тях:

  1. Вие въвеждате числа като DECIMAL(18, 18). Това означава "дайте ми число, което има място за ОБЩО 18 знака, като 18 от тях трябва да са след десетичната запетая". Това работи добре, стига вашето число да е по-малко от 0 (което е вярно за всички E-числа), но ще се повреди, ако се опитате да го използвате върху числа> 0. За числа> 0, просто прехвърлете като DECIMAL, без да указвате нищо друго .

  2. В случай, че добавите "КОГАТО @d като '%E+%' THEN CAST(@d AS FLOAT)", вие получавате различни резултати за числа <0, защото двигателят имплицитно прехвърля резултата по различен начин. Не знам правилата за това как sql сървърът решава да преобразува резултатите от CASE, но очевидно извършването на предложената от вас промяна кара двигателя да го преработи по различен начин. Изричното предаване на тези резултати като десетични знаци решава проблема.

  3. Трябва последователно да LTRIM и RTRIM резултатите си. Можете или да добавите LTRIM и RTRIM към всеки оператор на случай, или можете просто да LTRIM и RTRIM резултатите от случая.

Ето едно решение, което трябва напълно да реши всичко:

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. Връзка едно към едно с различен първичен ключ в EF 6.1 Code First

  2. Показване на данни от базата данни в DropDownList в asp.net MVC3

  3. Възможно ли е да промените типа данни на колона в изглед?

  4. Използване на Dapper с SQL пространствени типове като параметър

  5. Ограничение за регулярен израз на SQL Server