Ik was op zoek naar een manier om getallen op te maken zonder voorloop- of volgspaties, punten, nullen (behalve één voorloopnul voor getallen kleiner dan 1 die aanwezig zou moeten zijn).
Dit is frustrerend dat een dergelijke meest gebruikelijke opmaak niet gemakkelijk kan worden bereikt in Oracle.
Zelfs Tom Kyte suggereerde alleen een lange gecompliceerde oplossing als deze:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Maar ik heb een kortere oplossing kunnen vinden die de waarde maar één keer vermeldt:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Dit werkt zoals verwacht voor alle mogelijke waarden:
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 |
Nog steeds op zoek naar een nog kortere oplossing.
Er is een verkortingsaanpak met aangepaste helperfunctie:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Maar aangepaste pl/sql-functies hebben een aanzienlijke prestatieoverhead die niet geschikt is voor zware zoekopdrachten.