Oracle 浮点比较

问题描述

各有千秋!

我有一个非常奇怪的大数字情况。 查询

select edge_id from edges where rownum = 1 

返回 2.57775300147101E21

可以建议查询

select * from edges where edge_id = 2.57775300147101E21

select * from edges where edge_id = 2577753001471010000000

将返回一行。

但它返回“没有选择行”...

让我们继续:

select to_char(edge_id) from edges where rownum = 1 

返回 2577753001471010316917

这对我来说是意外的行为...... 这种情况下如何查询表

任何帮助将不胜感激。

解决方法

2.57775300147101E21 的显示值就是 - 显示值。实际值为 2577753001471010316917,如您的 TO_CHAR(... 查询所示,因此要检索此行(可能还有其他行),您需要使用正确的值:

SELECT *
  FROM EDGES
  WHERE EDGE_ID = 2577753001471010316917

或者您可以使用科学记数法中的正确值:

SELECT *
  FROM EDGES
  WHERE EDGE_ID = 2.577753001471010316917E21

或者您可以进行范围查询,例如:

SELECT *
  FROM EDGES
  WHERE EDGE_ID BETWEEN 2.5E21
                    AND 2.6E21

您用来查询数据库的任何工具显然都使用科学记数法显示“大”值。但是 2577753001471010316917 的值是您需要用来检索所需行的正确值。

db<>fiddle here

,

第一个答案是绝对正确的 - 只需将数字格式设置更改为 TME(用于科学记数法)或 TM9。 sql*plus 示例:格式 TM9:

SQL> show numf
numformat ""
SQL> select 2577753001471010316917 x from dual;

         X
----------
2.5778E+21

SQL> set numf tm9
SQL> select 2577753001471010316917 x from dual;

                                                               X
----------------------------------------------------------------
2577753001471010316917

SQL> set numf tme
SQL> select 2577753001471010316917 x from dual;

                                                               X
----------------------------------------------------------------
2.577753001471010316917E+21