Oracle SQL TO_CHAR (число, формат) - конечные нули - PullRequest
2 голосов
/ 18 июня 2020

В документации Oracle мы читаем о параметре форматирования, который:

0999    Returns leading zeros.
9990    Returns trailing zeros.

Я понимаю ведущие нули: отображать 000123 вместо 123.

Но завершающие нули?

Чем 9990 отличается от 9999?

Чем 99.90 отличается от 99.99?

1 Ответ

1 голос
/ 18 июня 2020

Вы можете использовать конечные нули, когда имеете дело с денежными значениями, например,

Таблица и данные

create table payments (
  payment number
) ;

insert into payments( payment )
select 11 from dual union all
select 11.1 from dual union all
select 11.11 from dual ;

Запрос

select payment amount from payments 
union
select sum( payment ) from payments ;

-- result

   AMOUNT 
_________ 
       11 
     11.1 
    11.11 
    33.21

Если вы пишете запрос или представление, которое применяет завершающие нули, вы сможете получить более "полезный" результат, например:

create or replace view payments_view ( position_, description, amount )
as
select 
  1 
, 'item'
, to_char( payment, '999,999.00' )
from payments
union
select 
  2
, 'total'
, to_char( sum( payment ), '999,999.00' ) 
from payments
;

select description, amount
from payments_view
order by position_
;

-- output
   DESCRIPTION         AMOUNT 
______________ ______________ 
item                 11.00    
item                 11.10    
item                 11.11    
total                33.21 

DBfiddle здесь .

{ 1} Чем 9990 отличается от 9999? {2} Чем 99,90 отличается от 99,99?

Чтобы сделать это «видимым», взгляните на набор результатов следующего запроса, который показывает различные вызовы функций, DUMP () (возвращает код для типа данных, длину его ввода в байтах и ​​«внутреннее представление» - кодовые точки UTF8 в десятичном виде в данном случае) и фактический вывод. Набор результатов также содержит 3 строки со значениями, дополненными с помощью LPAD () и RPAD () соответственно, чтобы упростить просмотр позиций цифр.

select 
  'to_char( 1,''9990'' )'       function_
, dump( to_char( 1,'9990' ) )   dump_
, to_char( 1, '9990' )          output_
from dual union all
select 'to_char( 1,''9999'' )', dump( to_char( 1, '9999' ) )
, to_char( 1, '9999' )
from dual union all 
select 'to_char( 1 )', dump( to_char( 1 ) )
, to_char( 1 )
from dual union all 
select 'to_char( 1,''fm9990'' )', dump( to_char( 1,'fm9990' ) )
, to_char( 1, '9999' )
from dual union all 
select 'to_char( 1,''fm9999'' )', dump( to_char( 1,'fm9999' ) )
, to_char( 1, '9999' )
from dual union all 
select 'to_char( 0,''99.90'' )', dump( to_char( 0,'99.90' ) )
, to_char( 0, '99.90' )  
from dual union all
select 'to_char( 0,''99.99'' )', dump( to_char( 0,'99.99' ) )
, to_char( 0, '99.99' )  
from dual union all
select 'to_char( 0,''90.99'' )', dump( to_char( 0,'90.99' ) )
, to_char( 0, '90.99' )  
from dual union all
select 'to_char( 0,''fm99.90'' )', dump( to_char( 0,'fm99.90' ) )
, to_char( 0, 'fm99.90' )  
from dual union all
select 'to_char( 0,''fm99.99'' )', dump( to_char( 0,'fm99.99' ) )
, to_char( 0, 'fm99.99' )  
from dual union all
select 'lpad( ''1'', 5, '' '' )', null, lpad( '1', 5, ' ' ) from dual union all
select 'lpad( ''12345'', 6, ''_'' )', null, lpad( '12345', 6, '_' ) from dual union all
select 'rpad( ''12345'', 6, ''_'' )', null, rpad( '12345', 6, '_' ) from dual
;

Результат

                 FUNCTION_                             DUMP_    OUTPUT_ 
__________________________ _________________________________ __________ 
to_char( 1,'9990' )        Typ=1 Len=5: 32,32,32,32,49           1      
to_char( 1,'9999' )        Typ=1 Len=5: 32,32,32,32,49           1      
to_char( 1 )               Typ=1 Len=1: 49                   1          
to_char( 1,'fm9990' )      Typ=1 Len=1: 49                       1      
to_char( 1,'fm9999' )      Typ=1 Len=1: 49                       1      
to_char( 0,'99.90' )       Typ=1 Len=6: 32,32,32,46,48,48       .00     
to_char( 0,'99.99' )       Typ=1 Len=6: 32,32,32,46,48,48       .00     
to_char( 0,'90.99' )       Typ=1 Len=6: 32,32,48,46,48,48      0.00     
to_char( 0,'fm99.90' )     Typ=1 Len=3: 46,48,48             .00        
to_char( 0,'fm99.99' )     Typ=1 Len=2: 48,46                0.         
lpad( '1', 5, ' ' )                                              1      
lpad( '12345', 6, '_' )                                      _12345     
rpad( '12345', 6, '_' )                                      12345_ 

Ответы на ваши вопросы:

{1} Без разницы. В обоих случаях результаты заполняются пробелами (1 дополнительный пробел для «знака»). Эффект форматирования сравним с выводом LPAD () (см. Третью строку снизу результирующего набора).

{2} Без разницы.

Как @Ponder Stibbons Как уже упоминалось, будет разница, если число содержит десятичную точку и вы используете модификатор модели формата 'fm' , так как это удалит из вывода посторонние символы.

DBfiddle здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...