ORACLE:使用DECODE解决“除以零”错误,但需要将结果保留到小数点后第2位

s3fp2yjn  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(126)
select 
  A,
  B,
  NVL((A-B) / DECODE(A, 0, NULL, B), 0) as result

from table1
where NVL((A-B) / DECODE(A, 0, NULL, B), 0) as result > 0.5

字符串
我想知道如何解决“除以零”错误使用解码,但不知道如何与铸造,浮动,圆得到的除法结果到第二plance
用上面的代码,我得到整数结果

A     B    Result(A-B)/B
1500  700  1 
3000  0    blank or null


我需要得到的结果的第二个小数位,结果大于1

A     B    Result(A-B)/B 
1500  700  1.14
3000  0    blank or null

dffbzjpn

dffbzjpn1#

有多种选项;使用decodecasenullif,例如

SQL> with test (a, b) as
  2    (select 1500, 700 from dual union all
  3     select 3000,   0 from dual
  4    )
  5  select a, b,
  6    (a-b) / decode(b, 0, null, b) as result_1,
  7    --
  8    (a-b) / case when b = 0 then null else b end as result_2,
  9    --
 10    (a-b) / nullif(b, 0) as result_3
 11  from test;

         A          B   RESULT_1   RESULT_2   RESULT_3
---------- ---------- ---------- ---------- ----------
      1500        700 1,14285714 1,14285714 1,14285714
      3000          0

SQL>

字符串
正如你所看到的,默认情况下,结果 * 确实 * 包含小数,这意味着-如果你没有看到任何-它是关于你的环境和/或你使用的工具中的设置。
如果你想限制小数点的个数为2,通常我们使用round函数(另一个 * 流行 * 的选项是trunc):

5  select a, b,
  6    round((a-b) / decode(b, 0, null, b), 2) as result_1
  7  from test;

         A          B   RESULT_1
---------- ---------- ----------
      1500        700       1,14
      3000          0


如果您使用SQL*Plus(就像我一样),它提供了各种SET命令;其中一个命令允许您指定numformat,然后由numformat处理它:

SQL> set numformat 999g990d00
<snip>
  5  select a, b,
  6    (a-b) / decode(b, 0, null, b) as result_1
  7  from test;

          A           B    RESULT_1
----------- ----------- -----------
   1.500,00      700,00        1,14
   3.000,00        0,00

sh7euo9m

sh7euo9m2#

您可以将计算(包括ROUND)放入DECODE

SELECT A,
       B,
       DECODE(B, 0, 0, ROUND((A-B) / B), 2)) as result
FROM   table1
WHERE  DECODE(B, 0, 0, ROUND((A-B) / B), 2)) > 0.5

字符串
或者,如果你不想写DECODE语句两次,那么使用内联视图来过滤:

SELECT *
FROM   (
  SELECT A,
         B,
         DECODE(B, 0, 0, ROUND((A-B) / B), 2)) as result
  FROM   table1
)
WHERE  result > 0.5

相关问题