【发布时间】:2017-04-27 10:49:01
【问题描述】:
我有一张这样的表(简化版):
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时执行。
【问题讨论】:
-
无论如何这都会失败,因为
CASE表达式只能返回一种数据类型。在您的情况下,您在MONEY数据类型(返回MONEY)或''上使用SUM,这显然是一个字符串 -
@Lamak 这就是为什么我将
''更改为0以检查这是否有帮助。但是,该消息仍然出现。 -
因为您应该在
SUM中使用CASE表达式,对于初学者:SUM(CASE WHEN ISNUMERIC(Field) = 1 THEN Field END) -
这很重要。但是为什么我把它放在
SUM外面时会出现错误? -
虽然您已经接受了答案,但我会提醒您不要在与此类似的大多数情况下使用 ISNUMERIC。仅有的潜在值是 varchar 和 int 吗?
标签: sql-server sql-server-2008 tsql type-conversion