与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
函数,如果不是,我需要返回VarcharValue
和MAX
功能。
有什么建议吗?
答案 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)