2013-08-26 10 views
4

Мне нужно преобразовать данные таблицы и сделать некоторые манипуляции. одним из типов данных столбцов является Varchar, но он хранит десятичные числа. Я изо всех сил пытаюсь преобразовать varchar в десятичную.SQL Server: конвертировать varchar в десятичный (с учетом экспоненциальной нотации)

Я попытался следующие CAST (@ TempPercent1 как десятичные (28, 16))

Проблема заключается в том, что данные также имеет некоторые значения в экспоненциальной форме, например: 1.61022e-016. Запрос sql вызывает ошибку при столкновении с таким значением. Ошибка Error converting data type varchar to numeric.

Мне нужно знать, как обрабатывать экспоненциальные значения нотации при преобразовании varchar в десятичное преобразование?

+0

Это хороший урок? Не хранить номера как строки в первую очередь? –

+2

Согласен, что числа должны храниться как числа, а не строки. Но я выполняю миграцию данных, а исходные данные не находятся под моим контролем. – Tilak

ответ

6

Вы можете попробовать следующее, но вы можете потерять точность:

select cast(cast('1.61022e-016' AS float) as DECIMAL(28, 16)) 
0
select convert(Decimal(28,16),convert(float,'1.61022e-016')) 
2

Вы можете просто сделать

CAST(CAST(value AS float) AS decimal(36, 20)) 

но ...

Если вы сделаете это , cast-to-float также изменит все значения, у которых нет E внутри - поскольку поплавки могут быть только точными, как t он машина-эпсилон ...

Вы можете смягчить это, только забрасывая плавать, если число содержит E (+/-).
Если это нормальное десятичное число, просто нажмите на десятичную запятую.
Это минимизирует ошибки округления поплавка.

SELECT 
    CASE 
     WHEN factor LIKE '%E-%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20)) 
     WHEN factor LIKE '%E+%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20)) 
     ELSE CAST(factor AS DECIMAL(36, 20)) 
    END AS factor 
FROM T_IFC_Import_Currency 

Или более компактны:

SELECT 
    CASE 
     WHEN factor LIKE '%E[+-]%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20)) 
     ELSE CAST(factor AS DECIMAL(36, 20)) 
    END AS factor 
FROM T_IFC_Import_Currency 


Примечание:
Не упрощать это:

SELECT 
    CAST 
    (
     CASE 
      WHEN factor LIKE '%E[+-]%' THEN CAST(factor AS FLOAT) 
      ELSE factor 
     END 
     AS decimal(36,20) 
    ) AS factor 
FROM T_IFC_Import_Currency 

, потому что это означает, что случай expressi on сначала неявно бросается в float до того, как он будет преобразован в десятичный ...

Смежные вопросы