在以下代码中,floor()
(在iif()
的第3个参数中)未按预期返回100
;它返回100.00
。我只是测试输出和逻辑,因此测试硬编码值。
select iif(floor(100.000) < cast(round(100.000, 2) as decimal(5, 2)), cast(round(100.000, 2) as decimal(5, 2)), floor(100.000))
然而,这确实会按预期返回100
。我不确定原因:
select floor(100.000)
此外,回到iif()
函数:如果我首先将floor函数内的值转换为float
,它确实返回100
。我已尝试将其投放到integer
和decimal
,floor()
仍会返回100.00
。这真的让我失望了。我的印象是floor
只会返回十进制后的任何内容,如果它是money
类型。
答案 0 :(得分:1)
来自docs on IIF
:
从true_value和false_value
中的类型返回具有最高优先级的数据类型
rules on data type precedence:
当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定优先级较低的数据类型转换为优先级较高的数据类型
由于表达式的true_value
部分返回decimal
,因此整个表达式将执行相同的操作。
使用更简单的例子:
SELECT IIF(0 > 0,
CAST(1 AS DECIMAL(5, 2)),
2)
这会导致2
投射到decimal
。