在MySQL中返回超过2位小数的所有数字

时间:2013-03-15 14:33:06

标签: mysql

我的数据库中有类似的数据:

+----+----------------+
| id | summ (varchar) |
+----+----------------+
|  1 | 30.23          |
|  2 | 10.235         |
|  3 | 20.2300        |
|  4 | 100.005        |
|  5 | 5.031          |
|  6 | 0.0010002      |
+----+----------------+

如何在MySQL查询中收到超过2位十进制数字(零还计数)的所有数据?

一开始我只得到那些有3位数并以5结尾的那些,所以我使用了这个命令substring( summs * 100, -2 ) = '.5',但我不知道如何得到各种数字。

4 个答案:

答案 0 :(得分:4)

您可以这样做: -

SELECT * 
FROM `table` 
WHERE LENGTH(SUBSTR(`summ `,INSTR(`summ `,"."))) >3

答案 1 :(得分:0)

所以你希望SQL查询排除“20.23”但包含“20.2300”,是吗?

鉴于这些是字符串,而不是浮点数,您可以在查询中使用字符串函数,特别是INSTR()和LENGTH()的组合。使用前者来定位小数点(句点),然后将其与字符串的长度(减去2)进行比较。

答案 2 :(得分:0)

您还可以执行以下操作:

SELECT *
FROM tableName
WHERE columnName <> ROUND (columnName, 2)

答案 3 :(得分:0)

我想@Rahul Tripathi的解决方案很可能是最好的。

但是我在不同的上下文中尝试了一些方法,并根据以下问题的答案找到了另一个可能解决方案:Store only numbers after Comma mysql

此解决方案受到“严格限制”,在这种情况下,由于MySQL的工作方式以及存储浮点值等,因此它可以正常工作。

假定summ是一个数字(如果是字符串,则需要强制转换,或仅使用@Rahul Tripathi的解决方案)。并且由于精度和存储原因,summ最好是一个十进制而不是 float

SELECT * 
FROM `table` 
WHERE (LENGTH(TRIM(TRAILING "0" from MOD(`summ`, 1))) - 2) > 2;

要测试:

set @fraction = 100.005;
set @modulo = mod(@fraction, 1);
set @modulo = trim(trailing "0" from @modulo);
set @decimals = length(@modulo) - 2;

select @fraction, @modulo, @decimals;
+-----------+---------+-----------+
| @fraction | @modulo | @decimals |
+-----------+---------+-----------+
|   100.005 |   0.005 |         3 |
+-----------+---------+-----------+
1 row in set (0.00 sec)

注意:使用CAST("12.345" as DECIMAL(10,5))进行转换需要先知道有关显示位数的知识。如果您正在计算数据库中的值或使用"12.345" + 0从字符串中强制转换它们,则可以使用,但是由于二进制浮点数的存储方式,您将得到类似"12.345" + 0→{ {1}}可能不是您想要的答案。然后,您可以尝试在某个位置后再次舍入以除去数字,依此类推...