2009-10-13 16 views
2

我在尋找一種優雅的方式爲VARCHAR類型的字段轉換,並在它的可變數據,爲數據類型可以用於從現場 數學運算採樣數據(不包括引號)SQL Server中的變量varchar字段轉換爲金錢/十進制/東西帶小數位

'' 
'abc' 
'23' 
'23.2' 

的方法應該適用於所有,並第&第二值應該返回0,而不是拋出一個SQL Server錯誤..

+0

通常,當你存儲在一個場不同類型的數據,它表明你有一個數據庫設計問題。 – HLGEM 2012-07-19 18:53:22

回答

0
SELECT CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END 
FROM mytable 
3

試試這個:

SELECT CASE WHEN IsNumeric(YourColumn) = 0 THEN 
      0 
     ELSE 
      CAST(YourColumn AS decimal(18, 2)) 
     END 

您必須調整目標數據類型,我選擇了十進制(18,2)進行演示。

+0

+1你用秒打我:-) – 2009-10-13 10:58:23

+2

IsNumeric是一個令人討厭的小函數,只要一個類型轉換爲它返回1的任何數值類型,但是你不知道哪個類型已經同意它可以轉換,所以對於輸入「£1.20」,它會扔在施放的錯誤,即使它通過了ISNUMERIC。 – Andrew 2009-10-13 10:59:31

+0

感謝這個信息 – pablo 2009-10-13 11:10:50

0

如果您想將其轉換,你應該使用的UPDATE代替SELECT

UPDATE Table 
SET Col1 = CAST(Col1 As Decimal(18,2)) 
1

我知道這是一個早已死亡的線程,但我最近從谷歌搜索偶然發現了它,並有一個思想。它不如CASE聲明的優雅,但它是一種選擇。

SELECT 
    COALESCE(CAST(NULLIF(ISNUMERIC(LEFT(MyColumn, PATINDEX('% %', MyColumn + ' ') - 1)), 1) AS MONEY), LEFT(MyColumn, PATINDEX('% %', MyColumn + ' ') - 1)) 
FROM 
    myTable 

,或者你可以這樣做:

Select COALESCE(CAST(NULLIF(ISNUMERIC(MyColumn), 1) AS MONEY), MyColumn) 
FROM 
    myTable 

頂級版本會看到「2」剛剛2,底部的人會看到它作爲一個文本字段。

0

COALESCE對此是一個很好的選擇:查找更多信息here.它按順序計算參數並返回第一個表達式的當前值,該表達式最初不計算爲NULL。

ISNUMERIC返回0或1取決於如果被評估的值可以被認爲是SQL「數字」或「數字」類型中的一種。例如int,bigint,money ..

NULLIF本質上找到您指定的值,如果它匹配,則將其替換爲NULL值。

CAST只要改變這個例子來MONEY

數據類型到另正如你可以看到,如果你打破了樓下使用該信息的一個非常優雅的解決方案,我認爲?

COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1) 
相關問題