值在oracle中未显示为前导零

时间:2018-07-10 15:11:51

标签: sql oracle oracle-apex number-formatting

我有一个表,其中有一个列的前导零数据( number 数据类型)。当我尝试查询apex-SQL Workshop中的列时,它没有显示前导零。因此,我需要手动将其转换为带有前导零的显示值。但是转换时会出现问题。

如果我显式使用to_char格式化,则它将影响正常值。 例如

select to_char(colA,'0.99') from tab1 
当值是.87时,

会给我 0.87 ,但我们也有不带小数的值。在这种情况下,它将给我###。基本上我想按原样显示值(但如果值以十进制开头,则添加0)。它也不应添加尾随零。是否有任何方法可以实现呢?例如,下面将给出 661.00 。但这不应该给。如果是整数,则应显示相同的值。

select to_char(661,'999G999G999G999G990D00MI') from dual 

3 个答案:

答案 0 :(得分:2)

您可以使用'FM999999990D9999'之类的遮罩来接近,十进制小数点的每一边都有适当的9位数,以覆盖您可能拥有的所有值。

with tab1 (cola) as (
         select 0.87 from dual
  union  select 661 from dual
  union  select 661.87 res from dual
  union  select 1.5 res from dual
)
select cola, to_char(cola, 'FM999999990D9999')
from tab1;

      COLA TO_CHAR(COLA,'F
---------- ---------------
       .87 0.87           
       1.5 1.5            
       661 661.           
    661.87 661.87         

FM删除结尾的零和前导空格(包括用于+/-号的标称空格)。

要摆脱尾随的小数点标记,您也需要对其进行修剪:

with tab1 (cola) as (
         select 0.87 from dual
  union  select 661 from dual
  union  select 661.87 res from dual
  union  select 1.5 res from dual
)
select cola, rtrim(to_char(cola, 'FM999999990D9999'), to_char(0, 'FMD'))
from tab1;

在这两个方面,我都坚持使用D;您可以在两者中都使用固定的.,因此不需要第二个to_char()调用来转换它,但是您可能希望它由会话控制-无论哪种方式都必须保持一致。


如果您不知道需要包含多少个9,可以根据小数点分隔符前后的位数为每个数字生成定制格式掩码:

with tab1 (cola) as (
            select 0.87 from dual
  union all select 661 from dual
  union all select 661.87 res from dual
  union all select 1.5 res from dual
  union all select 0.00045354543 from dual
)
select cola,
  'FM' || lpad('0', length(trunc(cola)), '9')
       || case when trunc(cola) != cola
               then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
          end as format_mask,
  to_char(cola,
    'FM' || lpad('0', length(trunc(cola)), '9')
         || case when trunc(cola) != cola
                 then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
            end) as result
from tab1;

           COLA FORMAT_MASK          RESULT              
--------------- -------------------- --------------------
            .87 FM0D99               0.87                
            661 FM990                661                 
         661.87 FM990D99             661.87              
            1.5 FM0D9                1.5                 
   .00045354543 FM0D99999999999      0.00045354543       

这依赖于隐式转换,但似乎适用于正数,负数和零。不需要修整结果,因为对于非整数,只包含小数点分隔符D。

答案 1 :(得分:0)

还要考虑您的格式掩码错误D9​​9应该可以帮助您:

SQL> with a as
 2  (      select 1/100 nb, '0.01' res from dual
 3  union  select 20 nb, '20' res from dual
 4  union  select 444/100 nb, '4.44' res from dual
 5  union  select 120/100 nb, '1.2' res from dual)
 6  select nb, to_char(nb,'999G990D99') t_c, res from a

       NB       T_C         RES 
       ,01      0,01        0.01
       1,2      1,20        1.2 
       4,44     4,44        4.44
       20       20,00       20  

答案 2 :(得分:0)

如何在查询中为相关列使用case语句?

类似这样的东西:

select case 
when INSTR(to_char(:test_no),'.') = 1
then replace(to_char(:test_no),'.','0.')
else to_char(:test_no)
end as 'test_no'
from dual