sql >> Database >  >> RDS >> Oracle

Oracle - Waarom verdwijnt de voorloopnul van een getal bij het converteren naar TO_CHAR

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.



  1. Hoe ORD() werkt in MariaDB

  2. Hoe Lighttpd te installeren met PHP, MariaDB en PhpMyAdmin in Ubuntu

  3. Hoe kan ik mogelijke waarden opsommen in een MySQL-database?

  4. Hoe de uitvoer van de opgeslagen procedure terug te sturen naar een variabele in de sql-server