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

Oracle - Warum verschwindet die führende Null einer Zahl beim Konvertieren in TO_CHAR

Ich suchte nach einer Möglichkeit, Zahlen ohne führende oder nachgestellte Leerzeichen, Punkte und Nullen zu formatieren (außer einer führenden Null für Zahlen kleiner als 1, die vorhanden sein sollte).

Es ist frustrierend, dass eine solche gebräuchliche Formatierung in Oracle nicht einfach erreicht werden kann.

Sogar Tom Kyte hat nur eine lange komplizierte Problemumgehung wie diese vorgeschlagen:

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

Aber ich konnte eine kürzere Lösung finden, die den Wert nur einmal erwähnt:

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

Dies funktioniert wie erwartet für alle möglichen Werte:

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 |

Ich suche immer noch nach einer noch kürzeren Lösung.

Es gibt einen verkürzten Ansatz mit benutzerdefinierter Hilfsfunktion:

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

Aber benutzerdefinierte pl/sql-Funktionen haben einen erheblichen Leistungsaufwand, der für umfangreiche Abfragen nicht geeignet ist.