Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle - Защо водещата нула на число изчезва при преобразуването му в TO_CHAR

Търсех начин да форматирам числа без водещи или крайни интервали, точки, нули (с изключение на една водеща нула за числа, по-малки от 1, които трябва да присъстват).

Това е разочароващо, че такова най-обикновено форматиране не може лесно да се постигне в Oracle.

Дори Том Кайт само предложи дълго сложно решение като това:

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

Но успях да намеря по-кратко решение, което споменава стойността само веднъж:

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

Това работи според очакванията за всички възможни стойности:

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 |

Все още се търси още по-кратко решение.

Има подход за съкращаване с персонализирана помощна функция:

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

Но персонализираните pl/sql функции имат значителни разходи за производителност, които не са подходящи за тежки заявки.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да премахнете крайните интервали след името на месеца в Oracle

  2. Как да напиша заявка, която прави нещо подобно на GROUP_CONCAT на MySQL в Oracle?

  3. Възможно ли е да се създават типове обекти на Oracle Database вътре в PL/SQL?

  4. Разделената последователност на Oracle

  5. ORA-00911:невалиден знак