如果值为数字,则在 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 VarcharValue
和 MAX
函数。
有什么建议吗?
你有一个奇怪的构造,因为一个 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)
我遇到了与 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 VarcharValue
和 MAX
函数。
有什么建议吗?
你有一个奇怪的构造,因为一个 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)