【问题标题】:Getting right part of a decimal point in oracle sql在oracle sql中获取小数点的正确部分
【发布时间】:2023-03-17 10:47:01
【问题描述】:

我正在计算一个十进制数。我想得到正确的小数部分。这在 Oracle SQL 中可行吗?

例如- 1/4 = 0.25

我需要使用 oracle sql 获取 25 部分。

select substr(TO_CHAR(ROUND((num1/num2)*24,2)), instr(TO_CHAR(ROUND((num1/num2),2)), '.') + 1) from dual

这有时有效,有时无效,在 Oracle SQL 中是否有另一种方法可以将点拆分为十进制数字并获得正确的部分?

【问题讨论】:

  • Gordon 已经问过您结果是否必须是字符串或数字。但是还有更多的问题。如果输入(算术结果)是 2.398,那么期望的输出是什么? 39? 398?还是4?还是40?通过您的尝试,您将四舍五入到小数点后两位。如果你对该数字进行四舍五入,结果是 2.4,所以之后唯一有意义的输出是 4 或者可能是 40。另外:输入可以是负数吗?如果输入是-1.25,输出应该是什么?还是 25 岁?

标签: sql oracle split


【解决方案1】:

一种选择是获取锚定 ($) 到结果字符串 (to_char) 右侧的数字:

SQL> select 1/4 value,
  2         regexp_substr(to_char(1/4), '\d+$') result
  3  from dual;

     VALUE RESULT
---------- ----------
       ,25 25

SQL>

【讨论】:

  • 非常感谢我尝试了很多次使用正则表达式你的作品
  • @KushanPeiris 请注意这一点,因为当值为整数时,小数部分不会返回0,而是会返回整数值。
【解决方案2】:

可以使用MOD()函数返回小数点后的部分:

select mod(<whatever>, 1)

【讨论】:

  • 嗨谢谢这个作品,但我需要没有小数点(只有小数点右边的数字部分没有小数点)
  • 您希望将值作为数字还是字符串?
  • 这是唯一的问题 - “数字还是字符串”?你对这个问题的其他一切都清楚吗?例如,如果输入为负:余数(-1.2, 1) = -0.2;那是OP想要的吗?你已经知道答案了吗?
【解决方案3】:

你可以使用:

SELECT numerator,
       denominator,
       REPLACE( ABS(MOD( numerator/denominator, 1 )), '.' ) AS decimal_part
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name ( numerator, denominator ) AS
SELECT 1, 4 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 2, 3 FROM DUAL UNION ALL
SELECT -9, 7 FROM DUAL;

输出:

分子 |分母 | DECIMAL_PART --------: | ----------: | :---------------------------- 1 | 4 | 25 2 | 1 | 0 2 | 3 | 666666666666666666666666666666666666667 -9 | 7 | 28571428571428571428571428571428571429

如果你希望小数部分的符号与值相同,那么:

SELECT numerator,
       denominator,
       REPLACE( MOD( numerator/denominator, 1 ), '.' ) AS decimal_part
FROM   table_name;

哪些输出:

分子 |分母 | DECIMAL_PART --------: | ----------: | --------------------------------------: 1 | 4 | 25 2 | 1 | 0 2 | 3 | 666666666666666666666666666666666666667 -9 | 7 | -28571428571428571428571428571428571429

db小提琴here

【讨论】:

    【解决方案4】:

    如果是整数,使用上面的正则表达式可能会返回整数,我使用以下来获取小数部分:

    select substr(replace(to_char(185.250), '.', ','),
    case
        when instr(replace(to_char(185.250), '.', ','), ',') = 0 then
            length(to_char(185.250))
        else
            instr(replace(to_char(185.250), '.', ','), ',') end +1)
    from dual;
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2014-09-26
      • 2015-04-04
      • 1970-01-01
      相关资源
      最近更新 更多