Oracle
 sql >> Database >  >> RDS >> Oracle

I valori non vengono visualizzati con lo zero iniziale in Oracle

Puoi avvicinarti con una maschera come 'FM999999990D9999' , con un numero appropriato di 9 secondi per lato del decimale per coprire tutti i valori che potresti avere.

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         

Il FM rimuove gli zeri finali e gli spazi iniziali (incluso uno spazio nominale per un segno +/-).

Per eliminare anche l'indicatore decimale finale è necessario ritagliarlo:

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;

Ho bloccato con D in entrambe le parti; potresti usare un . in entrambi, quindi non hai bisogno del secondo to_char() call per convertirlo, ma potresti volere che sia controllato dalla sessione, in entrambi i casi deve essere coerente.

Se non sai quanti 9 devi includere, puoi generare una maschera di formato su misura per ogni numero, in base a quante cifre ci sono prima e dopo il separatore decimale:

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       

Questo si basa sulla conversione implicita ma sembra funzionare per positivo, negativo e zero. Non è necessario tagliare il risultato perché il separatore decimale D è incluso solo per i non interi.