2013-08-26 29 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精確一致他機-epsilon ...

你可以減輕,只有鑄造浮動如果數字包含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 


注:因爲這意味着案件expressi

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 


不要簡化這在第一次隱式投射之前,它被投射到十進制...

相關問題