我正在做一个简单的查询,它使用DateDiff函数来查找日期之间的天数。但是,对于某些实例,我想填充一个空白字段(不是null)。
这样的东西就是我现在拥有的东西,似乎工作得很好(但它填充了一个null)。
[Test (Years)] = CASE WHEN TYPE IN ('A','B')
THEN NULL ELSE IsNull(CONVERT(decimal(28,12),
(DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END
现在,如果我尝试这样的东西...试图将所有TYPE A和B转换为填充空白,我将收到以下错误消息:Error converting data type varchar to numeric.
[Test (Years)] = CASE WHEN TYPE IN ('A','B')
THEN '' ELSE IsNull(CONVERT(decimal(28,12),
(DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END
我缺少一件简单的事吗?我试过没有转换成十进制的计算,但它似乎没有用。有任何想法吗?感谢
答案 0 :(得分:1)
CASE
是一个只返回一个值的表达式,所有分支都必须产生兼容的类型。字符串(即使是空字符串)与小数不兼容,因此您需要执行以下操作:
CASE WHEN ... THEN '' ELSE
CONVERT(VARCHAR(32), COALESCE(CONVERT(DECIMAL(23,12), ... ,0)) END
请注意,只有在向最终用户展示数据时,此黑客才会生效。如果您尝试将此数据存储在列中或在其他计算中使用它,它也会被空字符串绊倒。数字不能是空字符串:
DECLARE @i INT = '';
SELECT @i;
结果:
0
因此,如果您不希望将“空”数字解释为0,请不要害怕NULL
,如果您在演示时处理此问题,请让表示层显示空白字符串NULL
。