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

Oracle - Hvorfor forsvinder det indledende nul i et tal, når det konverteres til TO_CHAR

Jeg ledte efter en måde at formatere tal på uden indledende eller efterfølgende mellemrum, punktum, nuller (undtagen et indledende nul for tal mindre end 1, der skulle være til stede).

Det er frustrerende, at en sådan mest almindelig formatering ikke let kan opnås i Oracle.

Selv Tom Kyte foreslog kun en lang og kompliceret løsning som denne:

case when trunc(x)=x
    then to_char(x, 'FM999999999999999999')
    else to_char(x, 'FM999999999999999.99')
end x

Men jeg var i stand til at finde en kortere løsning, der kun nævner værdien én gang:

rtrim(to_char(x, 'FM999999999999990.99'), '.')

Dette fungerer som forventet for alle mulige værdier:

select 
    to_char(num, 'FM99.99') wrong_leading_period,
    to_char(num, 'FM90.99') wrong_trailing_period,
    rtrim(to_char(num, 'FM90.99'), '.') correct
from (
  select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
  unpivot (num for dummy in (c1, c2, c3, c4, c5))
) sampledata;

    | WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
    |----------------------|-----------------------|---------|
    |                  .25 |                  0.25 |    0.25 |
    |                   .1 |                   0.1 |     0.1 |
    |                  1.2 |                   1.2 |     1.2 |
    |                  13. |                   13. |      13 |
    |                 -70. |                  -70. |     -70 |

Leder stadig efter en endnu kortere løsning.

Der er en afkortningstilgang med tilpasset hjælpefunktion:

create or replace function str(num in number) return varchar2
as
begin
    return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;

Men brugerdefinerede pl/sql-funktioner har betydelige præstationsomkostninger, der ikke er egnede til tunge forespørgsler.



  1. Send en applikation med en database

  2. SQL DELETE-syntaks – Listet efter DBMS

  3. Fejlfind en fejl, når du forsøger at oprette en stor IMDB-model

  4. TRUNC(dato) Funktion i Oracle