floor()函数在IIF()中返回结果异常问题咨询
关于IIF函数中floor()返回100.00而非100的问题解析
嘿,这个问题我之前帮人排查过,本质是SQL里IIF函数的返回类型一致性规则在搞鬼,不是floor函数本身出问题啦!
问题根源
- 单独执行
select floor(100.000)时,floor函数会根据输入值的类型返回对应的整数类型(比如输入是float就返回int,输入是decimal就返回不带小数位的decimal),所以显示为100。 - 但放到IIF函数里情况就变了:IIF要求两个分支的返回类型必须兼容,SQL会自动把两个分支的类型统一成更“宽泛”的那个——你的第二个分支是
cast(round(100.000, 2) as decimal(5, 2))(带两位小数的decimal类型),所以第一个分支的floor结果(整数)会被隐式转换成decimal(5,2),自然就变成100.00了。
解决办法
根据你的需求,有几种处理方式:
- 如果你希望返回整数类型(不带小数),把两个分支都统一成整数类型:
select iif(floor(100.000) < cast(round(100.000, 2) as int), cast(round(100.000, 2) as int), floor(100.000)) - 如果需要保留decimal类型,但想让整数显示为100而非100.00,这取决于你的客户端工具设置(比如SSMS可以调整数值显示格式),底层数据类型还是decimal。
- 你提到的“先转换floor内的值”思路可行,显式指定floor结果的类型,确保和另一个分支匹配:
这里把floor结果转成select iif(floor(100.000) < cast(round(100.000, 2) as decimal(5, 2)), cast(round(100.000, 2) as decimal(5, 2)), cast(floor(100.000) as decimal(5,0)))decimal(5,0),既保留decimal类型,又不带小数位。
内容的提问来源于stack exchange,提问作者MichaelB
相关产品推荐
相关产品推荐

