使用ISNUMERIC失败了

时间:2016-12-12 14:28:48

标签: sql-server sql-server-2008 tsql type-conversion

我有一张这样的表(简化):

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值转换为money。 char值的语法不正确。

我甚至将ELSE案例从''更改为0,但我仍然收到相同的消息。

为什么我会得到例外?据我所知,SUM(...)返回0时不应执行ISNUMERIC(Field)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用混合数据类型可能会非常痛苦。尽可能考虑避免这种情况的表格设计。更复杂的是,IsNumeric并不总是返回what you might expect

在聚合之前过滤掉非数字是一种方法:

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