2012-10-05 47 views
2

我想字符串值轉換爲浮動如的Sql轉換字符串值

User entered value  Expected Result 
1/2      0.5 
1      1 
1/4      0.25 
1 1/2     1.5 

如何這種價值轉換成SQL服務器?

+1

您正在使用哪些DBMS?甲骨文? PostgreSQL的? DB2? –

+0

MS Sql服務器2008 –

+1

我只是好奇這是什麼動機...和SQL。 – xdazz

回答

0

不漂亮,但工程

SELECT CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, 0, CHARINDEX('/', val)) 
       ELSE val END AS float)/
     CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val))) 
       ELSE 1 END AS float) 
FROM dbo.test12 
WHERE CHARINDEX(' ', val) = 0 
UNION ALL 
SELECT CAST(SUBSTRING(val, 0, CHARINDEX(' ', val)) AS float) + 
     CAST(SUBSTRING(val, CHARINDEX(' ', val), CHARINDEX('/', val) - CHARINDEX(' ', val)) AS float)/
     CAST(SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val))) AS float) 
FROM dbo.test12 
WHERE CHARINDEX(' ', val) > 0 
-1

這種事情最好是在你的GUI完成:將其放入數據庫,而不是事後才計算表達式。如果您想保留原始用戶輸入,您可以隨時在GUI中插入。評估隨機用戶輸入在任何系統中都是危險的,因此最好解析和/或評估數據庫之外的輸入,以便限制潛在的影響,並且還可以使用更強大(或更少專業化的,如果您願意的話)編程語言比TSQL。

說了這麼多,你可以用動態SQL的東西(假設你的輸入總是在你已經顯示的格式):

declare @input varchar(10) 
set @input = '1 1/2' 
set @input = replace(@input, ' ', '+') 
exec('select cast(' + @input + '.0 as float)') 

但具有所有問題of dynamic SQL,包括信任用戶輸入。而且您不能在TSQL函數中使用動態SQL,因此您無法將其方便地包裝以便在查詢中使用。當然,您可以在TSQL過程中使用遊標或編寫CLR函數或存儲過程,但這種任務在數據庫中感覺不合適。順便說一句,this question非常相似。