如何高效筛选数据库中Payment列小数点后超2位的money类型数据?
筛选money类型列中小数点后超过两位的数据
问题场景
现有一张数据表,其中Payment列的数据类型为money,数据如下:
| ID | Payment |
|---|---|
| 1 | 41.20 |
| 2 | 42.30 |
| 3 | 43.4032 |
| 4 | 44.50 |
| 5 | 45.6082 |
| 6 | 46.70411 |
需要筛选出Payment列中小数点后位数超过2位的记录,避免使用游标或字符串转换这类低效率的方法(表中存在数千条数据),期望得到的结果如下:
| ID | Payment |
|---|---|
| 3 | 43.4032 |
| 5 | 45.6082 |
| 6 | 46.70411 |
高效解决方案
可以通过纯数值运算实现筛选,无需字符串转换或游标,性能更优,适合大数据量表:
方法一:利用ROUND函数
SELECT ID, Payment FROM YourTableName WHERE Payment <> ROUND(Payment, 2)
原理:如果Payment小数点后不超过两位,ROUND到两位小数后与原数相等;若超过两位,则结果不等。
方法二:利用数值取余判断
SELECT ID, Payment FROM YourTableName WHERE (Payment * 100) % 1 <> 0
原理:将数值乘以100后,若小数点后超过两位,结果会带有小数部分,对1取余结果大于0;若仅两位或更少小数,结果为整数,取余等于0。
方法三:利用FLOOR函数
SELECT ID, Payment FROM YourTableName WHERE Payment > FLOOR(Payment * 100) / 100
原理:将数值乘以100后取整再除以100,得到仅保留两位小数的数值,若原数大于该值,说明小数点后存在更多位数。
说明
以上方法均基于money类型的精确数值特性,不会出现精度丢失问题,且能利用Payment列的索引(如果已创建)进一步提升查询效率,远优于字符串转换或游标方案。
内容的提问来源于stack exchange,提问作者Yevhen Vasylynchuk
相关产品推荐
相关产品推荐

