如何更简洁地将0.5及以下数值向下取整为0?
更简洁的实现方案
当然有更简洁的写法!你的核心需求是:严格大于0.5的数取整为1,小于等于0.5的数取整为0,可以根据你使用的SQL方言选择以下几种方式:
通用SQL写法(适用于所有支持CASE的数据库)
把重复的判断逻辑统一,去掉冗余的条件判断:
SELECT CASE WHEN CAST(0.51 AS FLOAT) > 0.5 THEN 1 ELSE 0 END AS FiveOne, CASE WHEN CAST(0.5 AS FLOAT) > 0.5 THEN 1 ELSE 0 END AS Five, CASE WHEN CAST(0.4999999 AS FLOAT) > 0.5 THEN 1 ELSE 0 END AS FourNine
这个写法直接明确:只要数值严格大于0.5就返回1,否则返回0,完全匹配你的需求,比你原来的CASE语句更简洁易懂。
针对SQL Server的简化写法(使用IIF函数)
如果用的是SQL Server,可以用IIF函数进一步缩短代码:
SELECT IIF(CAST(0.51 AS FLOAT) > 0.5, 1, 0) AS FiveOne, IIF(CAST(0.5 AS FLOAT) > 0.5, 1, 0) AS Five, IIF(CAST(0.4999999 AS FLOAT) > 0.5, 1, 0) AS FourNine
IIF是CASE语句的简化版,当第一个条件为真时返回第二个参数,否则返回第三个参数,代码更紧凑。
处理任意数值的通用取整逻辑
如果你的需求不止局限于0-1之间的数(比如要对1.5取整为1,1.51取整为2),可以用下面的写法:
SELECT CASE WHEN CAST(0.51 AS FLOAT) - FLOOR(CAST(0.51 AS FLOAT)) > 0.5 THEN CEILING(CAST(0.51 AS FLOAT)) ELSE FLOOR(CAST(0.51 AS FLOAT)) END AS FiveOne, CASE WHEN CAST(0.5 AS FLOAT) - FLOOR(CAST(0.5 AS FLOAT)) > 0.5 THEN CEILING(CAST(0.5 AS FLOAT)) ELSE FLOOR(CAST(0.5 AS FLOAT)) END AS Five, CASE WHEN CAST(0.4999999 AS FLOAT) - FLOOR(CAST(0.4999999 AS FLOAT)) > 0.5 THEN CEILING(CAST(0.4999999 AS FLOAT)) ELSE FLOOR(CAST(0.4999999 AS FLOAT)) END AS FourNine
这个逻辑会先提取数值的小数部分,判断是否大于0.5,再决定是向上取整还是向下取整,适用于所有正负数值。
内容的提问来源于stack exchange,提问作者Shelby115
相关产品推荐
相关产品推荐

