Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Werte werden in Oracle nicht mit führender Null angezeigt

Sie können sich mit einer Maske wie 'FM999999990D9999' nähern , mit einer angemessenen Anzahl von Neunen auf jeder Seite der Dezimalstelle, um alle möglichen Werte abzudecken.

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         

Der FM entfernt nachgestellte Nullen und führende Leerzeichen (einschließlich eines nominellen Leerzeichens für ein +/- Zeichen).

Um auch das abschließende Dezimalzeichen loszuwerden, müssen Sie es abschneiden:

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;

Ich bin bei D geblieben in beiden Teilen davon; Sie könnten einen festen . verwenden in beiden, also brauchen Sie das zweite to_char() nicht aufrufen, um das zu konvertieren, aber vielleicht möchten Sie, dass es von der Sitzung gesteuert wird - so oder so muss es konsistent sein.

Wenn Sie nicht wissen, wie viele Neunen Sie einfügen müssen, können Sie für jede Zahl eine maßgeschneiderte Formatmaske erstellen, die auf der Anzahl der Ziffern vor und nach dem Dezimaltrennzeichen basiert:

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       

Dies beruht auf impliziter Konvertierung, scheint aber für positiv, negativ und null zu funktionieren. Das Ergebnis muss nicht gekürzt werden, da das Dezimaltrennzeichen D nur für Nicht-Ganzzahlen überhaupt enthalten ist.