我正在寻找一种方法来查找Oracle数据库表中的所有行,其中FLOATs特定列中的值超过八位有效数字。
我在想,可能会有一些聪明的数学方法来识别行,但我不能想到任何行。
应接受以下数字:
但不是以下
到目前为止我提出的唯一解决方案,我甚至不知道它是否真的有效,看起来像这样,但运行起来很慢,有更快的方法吗?
SELECT *
FROM table
WHERE LENGTH(TO_CHAR(ABS(field))) > 9;
答案 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