admin

值在oracle中不以前导零显示

sql

我有一个表,其中的列( 数字 数据类型)的数据前导零。当我尝试查询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

阅读 169

收藏
2021-07-01

共1个答案

admin

您可以使用遮罩来关闭,如'FM999999990D9999',在小数点的每边各加9s,以覆盖您可能拥有的所有值。

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。

2021-07-01