提问人:Yves Calaci 提问时间:10/30/2019 最后编辑:GMBYves Calaci 更新时间:10/31/2019 访问量:85
选择小数位数为 X >
Selecting decimal values with scale > X
问:
给定定义为 的列,选择具有超过显式小数位的所有值,例如:NUMBER(18,5)
X
1.00001
1.00012
1.00123
1.01234
1.12345
1.12340 (1.1234)
1.12300 (1.123)
1.12000 (1.12)
1.10000 (1.1)
什么时候,我们将有:X = 4
1.00001
1.00012
1.00123
1.01234
1.12345
答:
2赞
GMB
10/30/2019
#1
典型的解决方案是将数字提高到目标 10 的幂,然后检查是否有小数提醒。
因此,条件如下所示:
trunc(:mynumber * power(10, :myscale)) <> :mynumber * power(10, :myscale)
with mynumbers as (
select 1.00001 num from dual
union all select 1.00012 from dual
union all select 1.00123 from dual
union all select 1.01234 from dual
union all select 1.12345 from dual
union all select 1.12340 from dual
union all select 1.12300 from dual
union all select 1.12000 from dual
union all select 1.10000 from dual
),
myscale as (select 4 sca from dual)
select *
from mynumbers n
inner join myscale s
on trunc(n.num * power(10, s.sca)) <> n.num * power(10, s.sca)
NUM | SCA ------: | --: 1.00001 | 4 1.00012 | 4 1.00123 | 4 1.01234 | 4 1.12345 | 4
评论
0赞
Yves Calaci
10/30/2019
对不起,但为什么是 10 的幂?
0赞
GMB
10/30/2019
4 次方 10 表示 10000。所以基本上,将数字乘以 1000,看看是否有小数提醒。
0赞
Matthew McPeak
10/31/2019
@GMB我发布了您可能感兴趣的替代答案。
0赞
FidelCasto
10/30/2019
#2
使用SQL Server,这应该可以工作:
其中 LEN(CONVERT(DOUBLE PRECISION,[your_column]))-(LEN(CONVERT(INT,[your_column]))+1) > 4
评论
1赞
MT0
10/31/2019
您确定这是预言机解决方案吗?CONVERT
函数用于更改字符串上的字符集。
0赞
William Robertson
10/31/2019
而且 Oracle 中没有函数。len()
0赞
FidelCasto
10/31/2019
我的坏是它用于 SQL 服务器,没有注意到它是用于 Oracle 数据库的。
1赞
Gordon Linoff
10/30/2019
#3
这是 GMB 答案的变体(我喜欢,所以我也投了赞成票)。您可以使用以下命令检查十进制分量:mod()
mod(n.num * power(10, s.sca), 1) <> 0
该参数采用分数分量。1
1赞
Matthew McPeak
10/31/2019
#4
比 GMB 的答案更简单一点,我已经投了赞成票并且很好,就是以所需的精度将数字与数字进行比较。trunc()
例如,如果您希望所有内容的精度至少为小数点后 4 位,
WHERE num != trunc(num,4-1);
取一个像 0.1234 这样的数字。 是 0.123,这与数字不同,并且该数字至少有 4 位小数位。trunc(0.1234,4-1)
评论
0赞
GMB
10/31/2019
这看起来是最整洁的选择!
评论