如果值是数字,请在CASE中使用SUM

时间:2019-07-09 14:45:05

标签: sql tsql sql-server-2008

CASE子句众所周知的问题类似的情况:

DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;

在那种情况下,即使从理论上讲,您永远也不会遇到Divide by zero error encountered这种情况,但是代码将引发一个异常min(1/0)

所以我有类似的情况:

CASE WHEN CodeValue in ('Numeric1','Numeric2') THEN SUM(cast(VarcharValue as int)) ELSE max(VarcharValue) END

换句话说,如果SUM是数字(如果是数字,则可以由VarcharValue确定),我需要使用CodeValue函数,如果不是,我需要返回VarcharValueMAX功能。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您有一个奇怪的构造,因为一个case分支返回一个字符串,而另一个返回一个数字。在这种情况下,SQL Server决定该表达式返回一个数字。

您会遇到ELSE的问题,因为非数字字符串将转换为数字。错误。

以下可能起作用:

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(CAST(VarcharValue as int)))
      ELSE MAX(VarcharValue)
 END)

如果在过滤之前对所有数据都计算了SUM(),您可能仍然有一个问题(我认为使用聚合查询是可能的)。我的建议是升级到受支持的SQL Server版本并使用:

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(TRY_CAST(VarcharValue as int)))
      ELSE MAX(VarcharValue)
 END)

但是,您可以重复CASE逻辑:

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(CASE WHEN CodeValue in ('Numeric1', 'Numeric2')  THEN CAST(VarcharValue as int) END))
      ELSE MAX(VarcharValue)
 END)