使用SQL查找浮点数超过8位有效数字的所有行
我正在寻找一种方法来查找Oracle数据库表中的所有行,其中特定浮点数列中的值超过八位有效数字 我想可能有一些聪明的数学方法来识别行,但我想不出任何方法 应接受以下数字:使用SQL查找浮点数超过8位有效数字的所有行,sql,oracle,Sql,Oracle,我正在寻找一种方法来查找Oracle数据库表中的所有行,其中特定浮点数列中的值超过八位有效数字 我想可能有一些聪明的数学方法来识别行,但我想不出任何方法 应接受以下数字: 123456789 123456789.123 123456789.01 0.123456789 但不是下面的 123000000.000 0.1234567 1.1234567 到目前为止,我提出的唯一解决方案,我甚至不知道它是否真的有效,看起来像这样,但运行速度非常慢,有没有更快的方法 SELECT * FROM
- 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(在小数点之前)是否无效。浮点值存储为二进制。在转换为/转换为字符表示时,某些舍入问题可能会产生非常意外的结果。看起来像几位小数浮点数的内容,存储为类似的内容,但四舍五入,并返回许多位小数。