使用SQL查找FLOAT编号超过8位有效数字的所有行

时间:2017-06-02 06:06:24

标签: sql oracle

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

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

应接受以下数字:

  • 123456789
  • 123456789.123
  • 123456789.01
  • 0.123456789

但不是以下

  • 123000000.000
  • 0.1234567
  • 1.1234567

到目前为止我提出的唯一解决方案,我甚至不知道它是否真的有效,看起来像这样,但运行起来很慢,有更快的方法吗?

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

1 个答案:

答案 0 :(得分:1)

对于significance的具体定义,我认为没有更好的方法。更多你提出的解决方案不太正确,它会在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(replace('...', '0', ' '))
  • length => len