3

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

+----+----------------+
| 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

4 回答 4

7

你可以做这样的事情: -

SELECT * 
FROM `table` 
WHERE LENGTH(SUBSTR(`summ `,INSTR(`summ `,"."))) >3
于 2013-03-15T14:36:29.787 回答
0

因此,您希望 SQL 查询排除“20.23”但包含“20.2300”,是吗?

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

于 2013-03-15T14:45:32.017 回答
0

你也可以这样做:

SELECT *
FROM tableName
WHERE columnName <> ROUND (columnName, 2)
于 2019-03-26T05:39:33.700 回答
0

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

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

这个解决方案相当“受到严格限制”,在这种情况下它可以正常工作,因为 MySQL 如何使用和存储浮点值等。

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

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)

注意:casting withCAST("12.345" as DECIMAL(10,5))需要事先了解可能出现的位数。如果您正在计算数据库中的值或使用 将它们从字符串中转换"12.345" + 0,它会有些工作,但由于二进制浮点数的存储方式,您会得到类似:"12.345" + 012.34500000000000064这不是您可能想要的答案。然后,您可以尝试再次舍入以在某个位置后删除数字,依此类推...

于 2019-09-11T13:19:13.733 回答