sql >> Databasteknik >  >> RDS >> Oracle

Oracle - Varför försvinner den inledande nollan av ett tal när man konverterar det TO_CHAR

Jag letade efter ett sätt att formatera tal utan inledande eller efterföljande mellanslag, punkter, nollor (förutom en inledande nolla för nummer mindre än 1 som borde finnas).

Det är frustrerande att sådan vanliga formatering inte enkelt kan uppnås i Oracle.

Till och med Tom Kyte föreslog bara en lång och komplicerad lösning så här:

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

Men jag kunde hitta en kortare lösning som bara nämner värdet en gång:

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

Detta fungerar som förväntat för alla möjliga värden:

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 |

Letar fortfarande efter ännu kortare lösning.

Det finns en förkortningsmetod med anpassad hjälpfunktion:

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

Men anpassade pl/sql-funktioner har betydande prestationsoverhead som inte är lämpliga för tunga frågor.



  1. Psycopg2 gillar inte tabellnamn som börjar med en liten bokstav

  2. Min MySQL-trigger fungerar inte, enkel syntax, inte komplicerad

  3. Dålig praxis i databasdesign

  4. Öppna felnummermeddelandesökning