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

Как да форматирате число със запетая в Oracle

Когато използвате TO_CHAR() функция за форматиране на число в Oracle, използвате модел на форматиране, за да определите как трябва да бъде форматирано числото.

Например, можете да форматирате число като 12,345.00 или като 12.345,00 , в зависимост от вашия локал.

Форматният модел може да включва G или D форматни елементи, за да добавите запетая към число. Кой от тях ще използвате зависи от това дали искате запетаята като разделител на хиляди, или като десетичен знак.

Като алтернатива можете да използвате действителен знак запетая (, ) ако предпочитате, въпреки че този метод не е наясно с локал като G и D форматните елементи са.

G и D Елементи на формат

Ето пример за демонстрация на G и D форматни елементи:

SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Резултат:

12,345.00

В този случай разделителят на групата извежда запетая, а десетичният знак извежда точка. Това е така, защото моята текуща сесия е NLS_TERRITORY параметърът е настроен на Australia .

Ето какво се случва, ако променя моята NLS_TERRITORY параметър към Germany :

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Резултат:

12,345.00

Сега запетаята се използва за десетичния знак.

Като бързо обяснение на горния форматен модел:

  • fm модификаторът на формат потиска всяко подпълване, което може да бъде приложено към резултата.
  • 9 символите представляват числа.
  • 0 символът представлява числа, без да се потискат водещи или крайни нули.

Ето пълен списък с елементи на числовия формат, които можете да използвате като бърза справка.

Tтой NLS_NUMERIC_CHARACTERS Параметър

Когато зададем NLS_TERRITORY параметър (както в предишния пример), това имплицитно задава куп други параметри, включително NLS_NUMERIC_CHARACTERS параметър.

Tтой NLS_NUMERIC_CHARACTERS параметърът определя кои знаци се използват за разделителя на групата и десетичния знак.

Можем да направим заявка за V$NLS_PARAMETERS преглед, за да видите кои знаци се използват за разделителя на групата и десетичния знак:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';

Резултат:

,.

Тук виждаме, че десетичният знак е представен със запетая, а разделителят на групата е представен с точка.

Можете да промените стойността на NLS_NUMERIC_CHARACTERS параметър директно, ако желаете (т.е. без да променяте NLS_TERRITORY параметър).

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Резултат:

12,345.00

Но вероятно трябва да избягвате да правите това, защото това води до прекъсване на връзката между NLS параметрите. Вашите NLS параметри вече не отразяват стойностите по подразбиране за текущата територия. Освен ако нямате основателна причина да не го правите, обикновено е по-добре да промените NLS_TERRITORY параметър към съответната територия, така че други параметри също могат да бъдат актуализирани до техните по подразбиране за новата територия.

'nlsparam' Аргумент

Едно нещо, което трябва да спомена е, че T0_CHAR() функцията приема трети аргумент, който ви позволява временно да задавате различни NLS параметри, включително NLS_NUMERIC_CHARACTERS параметър. Когато направите това на ниво функция, това не променя стойността на тези параметри за текущата сесия.

Ето един пример:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT 
    TO_CHAR(12345, 'fm99G999D00') AS "r1",
    TO_CHAR(
        12345, 'fm99G999D00',
        'NLS_NUMERIC_CHARACTERS = ''.,'''
        ) AS "r2",
    TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;

Резултат:

          r1           r2           r3 
____________ ____________ ____________ 
12.345,00    12,345.00    12.345,00   

Тук зададох територията на сесията на Германия и след това извиках TO_CHAR() три пъти.

  • Първото обаждане използва NLS параметрите на сесията. Това означава, че разделителят на групата по подразбиране е точка.
  • При второто обаждане изрично зададох свои собствени NLS_NUMERIC_CHARACTERS параметър от функцията. В този случай зададох разделителя на групата да бъде запетая. Това не повлия на NLS параметрите на моята сесия, както се вижда от третото извикване.
  • Третото обаждане използва NLS параметрите на сесията, точно както първото. Както виждаме, разделителят на групата и десетичният знак не са били засегнати от (временната) промяна, която направихме при второто ни обаждане.

Твърдо кодирана запетая

Друг начин да добавите запетая към число е да го кодирате твърдо във вашия модел на формат.

Пример:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;

Резултат:

12,345.00

В този случай твърдо кодирах запетаята и точката. Правейки това игнорира разделителя на групата, зададен в NLS_NUMERIC_CHARACTERS параметър.

Множество запетаи

Можете да имате множество запетаи и/или разделители на групи в рамките на модел на формат.

Пример:

ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;

Резултат:

123,456,789.00

Невалидно разположение на запетая

Запетая или разделител на група не може да се появи отдясно на десетичен знак или точка в модел с числов формат.

SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;

Резултат:

Error report -
ORA-01481: invalid number format model

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. merge update oracle не може да получи стабилен набор от редове

  2. Грешка при свързване с локален хост на Java Oracle (ORA-12505)

  3. Изсипване на CLOB полета във файлове?

  4. Как да получите последния ред на Oracle таблица

  5. Използване на псевдоним в клауза WHERE