【问题标题】:Selecting decimal values with scale > X选择比例 > X 的十进制值
【发布时间】:2019-10-30 15:26:17
【问题描述】:

给定一个定义为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

【问题讨论】:

    标签: sql oracle precision


    【解决方案1】:

    一个典型的解决方案是把数字提高到目标的10次方,然后检查是否有小数提醒。

    所以条件看起来像:

    trunc(:mynumber * power(10, :myscale)) <> :mynumber * power(10, :myscale)
    

    Demo on DB Fiddle

    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)
    
    数字 | SCA ------: | --: 1.00001 | 4 1.00012 | 4 1.00123 | 4 1.01234 | 4 1.12345 | 4

    【讨论】:

    • 对不起,为什么是 10 的幂?
    • 4 power 10 表示 10000。所以基本上,将数字乘以 1000,看看是否有小数提示。
    • @GMB 我发布了您可能感兴趣的替代答案。
    【解决方案2】:

    这是 GMB 答案的变体(我喜欢这个答案,所以我也投了赞成票)。您可以使用mod() 检查小数部分:

    mod(n.num * power(10, s.sca), 1) <> 0
    

    参数1 采用分数分量。

    【讨论】:

      【解决方案3】:

      比 GMB 的答案简单一点,我赞成并且很好,只是将数字与所需精度的数字的 trunc() 进行比较。

      例如,如果您希望所有内容都具有至少 4 个小数位的精度,

      WHERE num != trunc(num,4-1);
      

      取一个像 0.1234 这样的数字。 trunc(0.1234,4-1) 是 0.123,这与数字不同,并且表明该数字至少有 4 个小数位。

      【讨论】:

      • 这看起来是最简洁的选择!
      【解决方案4】:

      使用 SQL Server 这应该可以工作:

      WHERE LEN(CONVERT(DOUBLE PRECISION,[your_column]))-(LEN(CONVERT(INT,[your_column]))+1) > 4

      【讨论】:

      • 您确定这是一个 oracle 解决方案吗? CONVERT function 用于更改字符串上的字符集。
      • Oracle 中没有len() 函数。
      • 我对 SQL 服务器的糟糕之处没有注意到它适用于 Oracle 数据库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多