Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在条件中使用ISNUMERIC失败_Sql Server_Sql Server 2008_Tsql_Type Conversion - Fatal编程技术网

Sql server 在条件中使用ISNUMERIC失败

Sql server 在条件中使用ISNUMERIC失败,sql-server,sql-server-2008,tsql,type-conversion,Sql Server,Sql Server 2008,Tsql,Type Conversion,我有一张这样的桌子(简化): 出于某些原因,我需要查询此表,如果它是数字,则获取字段的总和,如果不是,则返回'。我这样试过: SELECT CASE WHEN ISNUMERIC(Field) = 1 THEN SUM(CONVERT(MONEY, Field)) ELSE '' END FROM #table GROUP BY Field 但此查询导致以下例外情况: 无法将字符值转换为货币。char值的语法不正确 我甚至将ELSE案例从'更改为0,但我仍然收到了相同的信息 为什么我会得到例外

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

出于某些原因,我需要查询此表,如果它是数字,则获取
字段
的总和,如果不是,则返回
'
。我这样试过:

SELECT CASE WHEN ISNUMERIC(Field) = 1 THEN SUM(CONVERT(MONEY, Field)) ELSE '' END
FROM #table
GROUP BY Field
但此查询导致以下例外情况:

无法将字符值转换为货币。char值的语法不正确

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

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

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
返回

(No column name)
1234.00
0.00

使用混合数据类型可能是一件非常痛苦的事情。在可能的情况下,考虑避免这种情况的表格设计。更复杂的是,IsNumeric并不总是返回

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

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

使用混合数据类型可能是一件非常痛苦的事情。在可能的情况下,考虑避免这种情况的表格设计。更复杂的是,IsNumeric并不总是返回

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

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

这无论如何都会失败,因为
CASE
表达式只能返回一种数据类型。在您的情况下,您正在对
MONEY
数据类型(返回
MONEY
)使用
SUM
,或者
'
这显然是一个string@Lamak这就是为什么我将
'
更改为
0
,以检查这是否有帮助。但是,该消息仍然出现。因为您应该在
SUM
中使用
CASE
表达式作为起点:
SUM(当ISNUMERIC(Field)=1时,CASE然后Field END)
这是一个点。但是,当我把它放在
SUM
之外时,为什么会出现错误?虽然您已经接受了答案,但我要提醒您,在大多数类似的情况下,不要使用ISNUMERIC。唯一可能的值是varchar和int吗?这无论如何都会失败,因为
CASE
表达式只能返回一种数据类型。在您的情况下,您正在对
MONEY
数据类型(返回
MONEY
)使用
SUM
,或者
'
这显然是一个string@Lamak这就是为什么我将
'
更改为
0
,以检查这是否有帮助。但是,该消息仍然出现。因为您应该在
SUM
中使用
CASE
表达式作为起点:
SUM(当ISNUMERIC(Field)=1时,CASE然后Field END)
这是一个点。但是,当我把它放在
SUM
之外时,为什么会出现错误?虽然您已经接受了答案,但我要提醒您,在大多数类似的情况下,不要使用ISNUMERIC。唯一的潜在值是varchar和int吗?问题是,对于那些不是数字的字段,我还需要一个值(例如
0
)。@johncapelletti提供了比我自己更好的解决方案。这将满足您的要求。问题是,对于那些非数字字段,我还需要一个值(例如
0
)。@johncapelletti提供了一个比我自己的更好的解决方案。这将满足您的需要。谢谢,它现在起作用了:)我唯一不明白的是,为什么我只在将
CASE
语句放在
SUM
@diiN_uu之外时才会出现异常。很高兴为您提供帮助。如果案例在总和之外,您将得到一个数据类型confict。在内部,我们规范化了数据类型。谢谢,它现在起作用了:)我唯一不明白的是,为什么我只在将
CASE
语句放在
SUM
@diiN_uu之外时才得到异常。很高兴为您提供帮助。如果案例在总和之外,您将得到一个数据类型confict。在内部,我们规范化了数据类型。