sql >> Databáze >  >> RDS >> Oracle

Oracle - Proč zmizí úvodní nula čísla při převodu na TO_CHAR

Hledal jsem způsob, jak formátovat čísla bez úvodních nebo koncových mezer, teček, nul (kromě jedné úvodní nuly pro čísla menší než 1, která by měla být přítomna).

To je frustrující, že takové nejběžnější formátování nelze v Oracle snadno dosáhnout.

Dokonce i Tom Kyte navrhl dlouhé komplikované řešení, jako je toto:

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

Ale byl jsem schopen najít kratší řešení, které uvádí hodnotu pouze jednou:

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

Toto funguje podle očekávání pro všechny možné hodnoty:

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 |

Stále hledáme ještě kratší řešení.

K dispozici je zkracovací přístup s vlastní pomocnou funkcí:

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

Ale vlastní funkce pl/sql mají značnou režii výkonu, která není vhodná pro náročné dotazy.



  1. Jak najdu řetězec v databázi SQL Serveru?

  2. Jaký je formát pro PostgreSQL připojovací řetězec / URL?

  3. Počítání dnů mezi dvěma daty, kromě víkendů (pouze MySQL)

  4. Jak povolit hromadné oprávnění na serveru SQL Server