2017-04-06 65 views
-1

如何從varchar中分離小數?例如,我如何從'97 .4N IU/ML'獲得'97.4'?SQL:從varchar提取小數

+0

字符串中是否有任何一致的模式,例如數字總是前3個字符? –

+0

嘿大衛。是的,主角將始終是數字。不過,我的問題已得到解答。謝謝!! –

回答

1

假設的數字部分將永遠在左邊,你可以做

修訂

之前我的解決方案只提取的字符串的小數部分,它沒有任何轉換。此外,如果您收到錯誤的數據,則無法保證您在該列中獲得的內容,因此很可能您也可能獲得科學表達式,因此最好在嘗試提取數字之前執行ISNUMERIC()測試。使用Float類型從字符串轉換是很好的,因爲它也可以處理科學表達式,但將數字存儲爲浮點數不是一個好主意,因爲顯示爲2.70的浮點數可能不等於另一個浮點數顯示爲2.70,因爲在每個實例中系統決定存儲更多的精確位置,因此,如果您打算對數值進行任何比較或計算,則應該始終以固定的精度格式存儲數字。

CREATE TABLE MyTable(MyColumn VARCHAR(25)) 
GO 

INSERT INTO MyTable(MyColumn) 
VALUES 
('1.23E+10') 
,('2.23E+8') 
,('2.235432E-6') 
,('4 of 40') 
,('500mg/day') 
,('97.4N IU/ML') 
,('No Maximun') 
,(NULL) 
,('') 
,('See Appendix R') 
GO 

SELECT 
    CONVERT(DECIMAL(20,8), 
    CASE 
    WHEN IsNumeric(MyColumn)=1 THEN 
     CONVERT(FLOAT,MyColumn) 
    ELSE CONVERT(FLOAT,'0'+LEFT(MyColumn,PATINDEX('%[^0-9.]%',MyColumn)-1)) 
    END) AS MyDecimal 
    ,MyColumn 
FROM MyTable 

New SQL Fiddle

老回答

SELECT LEFT('97.4N IU/ML',PATINDEX('%[^0-9.]%', '97.4N IU/ML')-1) 

所以對一列執行它看起來像這樣

SELECT LEFT(MyColumn,PATINDEX('%[^0-9.]%', MyColumn)-1) FROM MyTable 

您可以測試(舊答案)在使用本SQL Fiddle

+0

謝謝!這對我所需要的是完美的。感謝您抽出時間。 –