Oracle
 sql >> Base de données >  >> RDS >> Oracle

Les valeurs ne s'affichent pas avec un zéro non significatif dans Oracle

Vous pouvez vous rapprocher avec un masque comme 'FM999999990D9999' , avec un nombre approprié de 9 de chaque côté de la décimale pour couvrir toutes les valeurs que vous pourriez avoir.

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         

La FM supprime les zéros de fin et les espaces de début (y compris un espace nominal pour un signe +/-).

Pour vous débarrasser également de la marque décimale finale, vous devez la supprimer :

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;

Je suis coincé avec D dans les deux parties de cela; vous pouvez utiliser un . fixe dans les deux donc vous n'avez pas besoin du second to_char() appelez pour convertir cela, mais vous voudrez peut-être qu'il soit contrôlé par la session - dans tous les cas, il doit être cohérent.

Si vous ne savez pas combien de 9 vous devez inclure, vous pouvez générer un masque de format sur mesure pour chaque nombre, en fonction du nombre de chiffres avant et après le séparateur décimal :

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       

Cela repose sur une conversion implicite mais semble fonctionner pour le positif, le négatif et le zéro. Il n'est pas nécessaire de couper le résultat car le séparateur décimal D n'est inclus que pour les nombres non entiers.