SQL Server 2019中查找仅最后一位小数非零的decimal字段记录
解决SQL Server中查找10位小数decimal字段最后一位非零记录的问题
可以通过以下几种可靠的方法定位目标记录:
方法一:数学取模运算(推荐)
利用decimal类型的精确运算,将字段放大10^10倍后取模10,判断结果是否不为0:
SELECT * FROM your_table WHERE FLOOR(your_decimal_column * 10000000000) % 10 <> 0;
- 原理:将字段乘以10000000000(10的10次方)后,原字段的最后一位小数会转化为整数的最后一位,取模10即可得到该位数值,非零则说明原字段最后一位小数不为0。
- 优势:完全基于数值运算,不受字符串格式影响,精度可靠,支持正负数值。
方法二:简化取模运算
如果字段数值范围不会导致浮点数精度丢失,也可以直接使用小数值取模:
SELECT * FROM your_table WHERE your_decimal_column % 0.000000001 <> 0;
- 原理:0.000000001是10^-9,取模运算后得到的余数就是原字段最后一位小数对应的数值(如42.5500000001取模后为0.0000000001),非零即符合条件。
方法三:字符串处理(备选)
通过将字段转换为字符串,检查最后一位字符是否不为0:
SELECT * FROM your_table WHERE RIGHT(CAST(your_decimal_column AS VARCHAR(50)), 1) <> '0';
- 注意:需确保VARCHAR的长度足够容纳字段的完整字符串表示,decimal(18,10)类型的字段最多需要20位左右(整数部分8位 + 小数点 + 10位小数),VARCHAR(50)足够覆盖。
注意事项
- 替换
your_table和your_decimal_column为实际的表名和字段名。 - 如果字段精度高于18位,需要调整
BIGINT或VARCHAR的长度,避免溢出或截断。
内容的提问来源于stack exchange,提问作者Mandy
相关产品推荐
相关产品推荐

