2016-12-12 21 views
0

失敗,我有這樣一個表(簡體):使用ISNUMERIC狀況

CREATE TABLE #table (Id INT, Field NVARCHAR(MAX)) 
INSERT INTO #table VALUES (1, 'SomeText') 
INSERT INTO #table VALUES (2, '1234') 

對於一些原因,我需要查詢該表並獲得Field總和,如果它是數字,並返回''如果是不。我想這樣的:

SELECT CASE WHEN ISNUMERIC(Field) = 1 THEN SUM(CONVERT(MONEY, Field)) ELSE '' END 
FROM #table 
GROUP BY Field 

但此查詢導致以下異常:

不能char值轉換爲錢。該char值具有不正確的語法。

我甚至改變了ELSE情況下,從''0但我仍然得到了同樣的信息。

爲什麼我會得到異常?據我所知,SUM(...)不應該被執行時ISNUMERIC(Field)返回0

+1

這無論如何都會失敗,因爲'CASE'表達式可以返回只有一個數據類型。在你的情況下,你正在'MONEY'數據類型(它返回'MONEY')或'''''上使用'SUM',這顯然是一個字符串 – Lamak

+0

@Lamak,這就是爲什麼我把''''改成'0'檢查這是否有幫助。但是,該消息仍然顯示。 –

+1

,因爲你應該在SUM中使用'CASE'表達式來啓動器:'SUM(CASE當ISNUMERIC(Field)= 1 THEN Field END)' – Lamak

回答

3
Select sum(case when ISNUMERIC(Field)=1 then cast(field as money) else 0 end) 
from #table 
Group By Field 

返回

(No column name) 
1234.00 
0.00 
+0

謝謝,它現在可以工作:)我唯一不理解的唯一原因就是爲什麼當我離開'SUM'外的'CASE'語句時,我只會得到異常。 –

+0

@diiN_樂於幫助。對於總和以外的情況,您將收到數據類型的信息。在裏面,我們規範了數據類型。 –

0

與混合數據類型的工作可以是一個真正的痛苦。儘可能考慮避免這種情況的桌子設計。爲了進一步複雜化,IsNumeric並不總是返回what you might expect

彙總之前過濾掉非NUMERICS是一條路可走:

SELECT 
    SUM(CONVERT(MONEY, Field)) 
FROM 
    #table 
WHERE 
    ISNUMERIC(Field) = 1 
GROUP BY 
    Field 
; 
+0

問題是我還需要一個值(例如'0')來表示那些不是數字的字段。 –

+0

@JohnCappelletti提供比我自己更好的解決方案。這將做你想要的。 –