使用SQL查找浮点数超过8位有效数字的所有行

使用SQL查找浮点数超过8位有效数字的所有行,sql,oracle,Sql,Oracle,我正在寻找一种方法来查找Oracle数据库表中的所有行,其中特定浮点数列中的值超过八位有效数字 我想可能有一些聪明的数学方法来识别行,但我想不出任何方法 应接受以下数字: 123456789 123456789.123 123456789.01 0.123456789 但不是下面的 123000000.000 0.1234567 1.1234567 到目前为止,我提出的唯一解决方案,我甚至不知道它是否真的有效,看起来像这样,但运行速度非常慢,有没有更快的方法 SELECT * FROM

我正在寻找一种方法来查找Oracle数据库表中的所有行,其中特定浮点数列中的值超过八位有效数字

我想可能有一些聪明的数学方法来识别行,但我想不出任何方法

应接受以下数字:

  • 123456789
  • 123456789.123
  • 123456789.01
  • 0.123456789
但不是下面的

  • 123000000.000
  • 0.1234567
  • 1.1234567
到目前为止,我提出的唯一解决方案,我甚至不知道它是否真的有效,看起来像这样,但运行速度非常慢,有没有更快的方法

SELECT *
FROM table 
WHERE LENGTH(TO_CHAR(ABS(field))) > 9;

对于你对
重要性的具体定义
,我认为没有更好的方法了。更糟糕的是,您提出的解决方案并不完全正确,它可能在
123000000.00
甚至
123456.7
上出错。因此,您需要删除
和尾随的零:

with data (a) as 
(
  select 12345678 from dual union all
  select 12345678.0 from dual union all
  select 12345678.1 from dual union all
  select 1234567 from dual union all
  select 123456789.234 from dual union all
  select 0.123456789 from dual
)
select
  *
from data
where
  length(rtrim(replace(to_char(abs(a)), '.'), '0')) >= 8
不幸的是,我没有Oracle DB来测试它。但是我有MS Sql Server,所以我移植并测试了它:

with data (a) as 
(
  select 12345678 union all
  select 12345678.0 union all
  select 12345678.1 union all
  select 1234567 union all
  select 123456789.234 union all
  select 0.123456789
)
select
  *
from data
where
  len(rtrim(replace(replace(str(abs(a)), '.', ''), '0', ' '))) >= 8
区别在于Oracle=>Sql Server:

  • rtrim(“…”、“0”)
    =>
    rtrim(替换(“…”、“0”、”)
  • length
    =>
    len

我认为没有办法解决这个问题,因为没有办法检查一个数字并确定有多少数字是真正重要的。当然,例如,
123000000.000
。为什么无效,但
123000001.000
122999999.000
将有效?无法自动确定尾随
0
s(在小数点之前)是否无效。浮点值存储为二进制。在转换为/转换为字符表示时,某些舍入问题可能会产生非常意外的结果。看起来像几位小数浮点数的内容,存储为类似的内容,但四舍五入,并返回许多位小数。