Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle - Pourquoi le zéro non significatif d'un nombre disparaît-il lors de sa conversion en TO_CHAR

Je cherchais un moyen de formater des nombres sans espaces de début ou de fin, points, zéros (sauf un zéro en tête pour les nombres inférieurs à 1 qui devrait être présent).

Il est frustrant de constater qu'un tel formatage le plus courant ne peut pas être facilement réalisé dans Oracle.

Même Tom Kyte n'a suggéré qu'une solution longue et compliquée comme celle-ci :

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

Mais j'ai pu trouver une solution plus courte qui ne mentionne la valeur qu'une seule fois :

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

Cela fonctionne comme prévu pour toutes les valeurs possibles :

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 |

Toujours à la recherche d'une solution encore plus courte.

Il existe une approche de raccourcissement avec une fonction d'assistance personnalisée :

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

Mais les fonctions pl/sql personnalisées ont une surcharge de performances importante qui ne convient pas aux requêtes lourdes.