Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle — dlaczego początkowe zero liczby znika podczas konwersji TO_CHAR

Szukałem sposobu na formatowanie liczb bez spacji wiodących lub końcowych, kropek, zer (z wyjątkiem jednego wiodącego zera dla liczb mniejszych niż 1, które powinno być obecne).

To frustrujące, że tak typowego formatowania nie da się łatwo osiągnąć w Oracle.

Nawet Tom Kyte zasugerował tylko długie, skomplikowane obejście, takie jak to:

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

Ale udało mi się znaleźć krótsze rozwiązanie, które wymienia wartość tylko raz:

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

Działa to zgodnie z oczekiwaniami dla wszystkich możliwych wartości:

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 |

Nadal szukam jeszcze krótszego rozwiązania.

Istnieje podejście skracające z niestandardową funkcją pomocniczą:

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

Ale niestandardowe funkcje pl/sql mają znaczny narzut na wydajność, który nie jest odpowiedni dla ciężkich zapytań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ZAKTUALIZOWAĆ jedną kolumnę za pomocą innej kolumny w innej tabeli? Błąd SQL:ORA-00933:Polecenie SQL nie zostało poprawnie zakończone

  2. R12.2 Określanie i konfiguracja edycji

  3. skuteczny sposób na sprawdzenie, czy istnieje wiersz tabeli

  4. Oracle SQL:Jak użyć więcej niż 1000 elementów w klauzuli IN

  5. Limit czasu połączenia dla DriverManager getConnection