嘗試將以下值轉換為正確的十進制值。
column_name
3.4202999999999997E-2
我嘗試了以下步驟:
TRY_CONVERT(decimal(30, 10), [column_name]),
CAST([column_name] AS float)
任何幫助深表感謝
uj5u.com熱心網友回復:
如果值為 a ,float則這將自動能夠顯式轉換為 a decimal:
DECLARE @f float = 3.4202999999999997E-2;
SELECT CONVERT(decimal(30,10),@f);
如果它是基于字串的資料型別,則您確實需要解決它;它不是數值的合適資料型別。該值'3.4202999999999997E-2'是不是一個有效的decimal值,所以你需要先將其轉換為一個float,然后decimal:
DECLARE @v varchar(50) = '3.4202999999999997E-2';
SELECT CONVERT(decimal(30,10),CONVERT(float,@v));
如果您從中得到錯誤,那么您的值就不是有效值float;這就是存盤數字資料如此愚蠢的原因之一。您可以使用以下方法丟棄壞資料TRY_CONVERT:
DECLARE @v varchar(50) = '3.4202999999999997ee-2';
SELECT CONVERT(decimal(30,10),TRY_CONVERT(float,@v));
uj5u.com熱心網友回復:
我假設您的輸入資料型別是基于文本的,所以我們假設 NVARCHAR。如果轉換為浮點數,則可能會丟失精度。這實際上取決于您的用例,但您可以嘗試手動處理這樣的指數公式(更多詳細資訊如下):
SELECT CASE SUBSTRING(c1, CHARINDEX('E', c1) 1, 1)
WHEN '-' THEN CAST(CAST(SUBSTRING(c1, 1, CHARINDEX('E', c1)-1) AS decimal(30,20)) / CAST(POWER(10, SUBSTRING(c1, CHARINDEX('E', c1) 2, 99)) AS INT) AS decimal(30,20))
WHEN ' ' THEN CAST(CAST(SUBSTRING(c1, 1, CHARINDEX('E', c1)-1) AS decimal(30,20)) * CAST(POWER(10, SUBSTRING(c1, CHARINDEX('E', c1) 2, 99)) AS int) AS decimal(30,20))
END AS [ResultValue]
FROM dbo.test
我用它作為測驗來模擬:
DROP TABLE IF EXISTS dbo.test
CREATE TABLE dbo.test
( c1 NVARCHAR(50) )
insert into test (c1) values ('3.4202999999999997E-2')
insert into test (c1) values ('1.2342999999999997E 3')
這是分步決議,然后在 CASE 陳述句中使用這些部分:
SELECT SUBSTRING(c1, 1, CHARINDEX('E', c1)-1) AS [BaseValue],
SUBSTRING(c1, CHARINDEX('E', c1) 1, 1) AS [ShiftDirection],
POWER(10, SUBSTRING(c1, CHARINDEX('E', c1) 2, 99)) AS [ShiftAmount]
FROM test
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384645.html
標籤:sql sql-server
上一篇:表被多次掃描以進行選擇/計數
