sql >> Database >  >> RDS >> Oracle

Waarden worden niet weergegeven met voorloopnul in orakel

Je kunt dichtbij komen met een masker zoals 'FM999999990D9999' , met een passend aantal negens aan elke kant van het decimaalteken om alle mogelijke waarden te dekken.

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         

De FM verwijdert nullen en voorloopspaties (inclusief een nominale spatie voor een +/- teken).

Om ook de achterste decimale markering te verwijderen, moet je deze wegknippen:

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;

Ik blijf bij D in beide delen daarvan; je zou een vaste . in beide, zodat je de tweede to_char() . niet nodig hebt call om dat te converteren, maar je wilt misschien dat het wordt beheerd door de sessie - het moet hoe dan ook consistent zijn.

Als u niet weet hoeveel negens u moet opnemen, kunt u voor elk getal een op maat gemaakt formaatmasker genereren, gebaseerd op het aantal cijfers voor en na het decimaalteken:

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       

Dit is gebaseerd op impliciete conversie, maar lijkt te werken voor positief, negatief en nul. Het resultaat hoeft niet te worden bijgesneden omdat het decimaalteken D alleen is opgenomen voor niet-gehele getallen.



  1. Oracle-datum tussen zoekopdracht

  2. Bibliotheek niet geladen:/usr/local/opt/readline/lib/libreadline.6.2.dylib

  3. Verbindingsreeksparameters voor Schema.ini

  4. Hoe selecteer je de eerste rij voor elke groep in MySQL?