Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Os valores não estão sendo exibidos com zero à esquerda no oracle


Você pode se aproximar com uma máscara como 'FM999999990D9999' , com um número apropriado de 9s em cada lado do decimal para cobrir todos os valores que você possa ter.
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         

O FM remove zeros à direita e espaços à esquerda (incluindo um espaço nominal para um sinal +/-).

Para se livrar do marcador decimal à direita também, você precisa cortá-lo:
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;

Eu fiquei com D em ambas as partes; você pode usar um . em ambos para que você não precise do segundo to_char() call para converter isso, mas você pode querer que ele seja controlado pela sessão - de qualquer forma, ele precisa ser consistente.

Se você não souber quantos 9s precisa incluir, poderá gerar uma máscara de formato sob medida para cada número, com base em quantos dígitos existem antes e depois do separador decimal:
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       

Isso depende da conversão implícita, mas parece funcionar para positivo, negativo e zero. Ele não precisa cortar o resultado porque o separador decimal D só é incluído para números não inteiros.