如果值为数字,则在 CASE 中使用 SUM

Using SUM in CASE if value is numeric

我遇到了与 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

换句话说,如果VarcharValue是数字,我需要使用SUM函数(如果是数字,可以由CodeValue确定),如果不是这样,我需要 return VarcharValueMAX 函数。

有什么建议吗?

你有一个奇怪的构造,因为一个 case 分支 returns 一个字符串和另一个数字。 SQL 服务器决定,在这种情况下,表达式 returns 是一个数字。

并且 ELSE 会出现问题,因为 non-numeric 字符串将被转换为数字。错误。

以下可能有效:

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

如果在过滤之前对所有数据计算 SUM()(我认为这可以通过聚合查询实现),您可能仍然有问题。我的建议是升级到支持的 SQL 服务器版本并使用:

(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)