2011-07-19 67 views
9

由於我的理由,我不能幫助我有一個varchar列,數據如下:820.0E-12,10.0E + 00。在視圖中鑄造科學記數法(從varchar - >數字)

我想要數值。所以我有這個測試查詢其工作原理:

declare @d varchar(256) 
set @d = '820.0E-12' 
select 
    CASE 
     WHEN @d like '%E-%' THEN LTRIM(RTRIM(CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18)))) 
     WHEN @d like '%E+%' THEN NULL 
     ELSE @d 
    END 

我的結果是:0.000000000820000000(這是我想要什麼)

更改我的SQL佔數字> 0( 10.0E + 00)是這樣的:

WHEN @d like '%E+%' THEN CAST(@d AS FLOAT) 

我的結果變爲:8.2E-10(這是不我想要的)

如果我改變@ d = '10 .0E + 00'然後我得到(這是正確的)。

我有一個觀點,我需要從一個varchar列輸出,其中包含科學記數法,鑄造/轉換爲十進制(18,18)。

有人能告訴我這裏有什麼瘋狂嗎?

或者,也許我的問題應該是,如何在視圖中將varchar科學記數法列轉換爲十進制輸出?

我的第一個WHEN語句也適用於數字< 0,但我也需要考慮號碼> 0。當我更改第二個的時候,要包括CAST,它打破/給出錯誤的結果。

+0

你發佈的代碼對我來說工作正常...當我改變爲'E + 12'時,CASE的輸出是'820000000000000' – JNK

回答

12

有幾個不同的問題在這裏同時在這裏聚集在一起。讓我們看看他們中的一些人:

  1. 您正在將數字轉換爲DECIMAL(18,18)。這意味着「給我一個有18個字符總數的空間,其中18個字符應該在小數點後面」。只要你的數字小於0(對於所有的E-號碼都是這樣),那麼它就可以正常工作,但是如果你嘗試在大於0的數字上使用它,它會中斷。對於大於0的數字,只需轉換爲DECIMAL而不指定任何其他數字。

  2. 在您添加「WHEN @d like'%E +%'THEN CAST(@d AS FLOAT)」的情況下,您會得到不同的< 0結果,因爲引擎隱式地轉換結果的方式不同。我不知道sql server如何決定如何轉換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)) 
+0

我整個早上都在這上面度過了。在我發佈這個問題之後,我在5分鐘後發現了自己的問題。感謝您的解釋。 –

3

你可以使用ISO 「真實」 數據類型


SELECT convert(numeric(18,18),convert(real,'820.0E-12')) 
--OR with more precision 
SELECT convert(numeric(18,18),convert(float(53),'820.0E-12')) 
0
mysql> select '820.0E-12' + 0, '10.0E+00' + 0; 
+-----------------+----------------+ 
| '820.0E-12' + 0 | '10.0E+00' + 0 | 
+-----------------+----------------+ 
| 0.00000000082 |    10 | 
+-----------------+----------------+ 

也就是說,簡單地添加0到VARCHAR應該給你一個數值。 (OK,你可能需要一個第一TRIM。)

基本上沒有合理的使用情況在FLOAT(m,n)mn;只需聲明FLOAT(最多約7位有效數字)或DOUBLE(約16)。