sql >> Database teknologi >  >> RDS >> Oracle

Sådan formateres et tal med komma i Oracle

Når du bruger TO_CHAR() funktion til at formatere et tal i Oracle, bruger du en formatmodel til at bestemme, hvordan tallet skal formateres.

For eksempel kan du formatere et tal som 12,345.00 eller gerne 12.345,00 , afhængigt af din lokalitet.

Formatmodellen kan inkludere G eller D formater elementer for at tilføje et komma til et tal. Hvilken du bruger afhænger af, om du vil have kommaet som et tusinde-separator eller som et decimaltegn.

Alternativt kan du bruge et faktisk kommategn (, ) hvis du foretrækker det, selvom denne metode ikke er lokalitetsbevidst som G og D formatelementer er.

G og D Formater elementer

Her er et eksempel til at demonstrere G og D formatelementer:

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

Resultat:

12,345.00

I dette tilfælde udsender gruppeseparatoren et komma, og decimaltegnet udsender et punktum. Det er fordi min nuværende sessions NLS_TERRITORY parameter er indstillet til Australia .

Her er, hvad der sker, hvis jeg ændrer min NLS_TERRITORY parameter til Germany :

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

Resultat:

12,345.00

Nu bruges kommaet til decimaltegn.

Som en hurtig forklaring af ovenstående formatmodel:

  • fm formatmodifikator undertrykker enhver udfyldning, der kan anvendes på resultatet.
  • 9 tegn repræsenterer tal.
  • 0 tegn repræsenterer tal uden at undertrykke nogen foranstillede eller efterfølgende nuller.

Her er en komplet liste over talformatelementer, som du kan bruge som en hurtig reference.

Than NLS_NUMERIC_CHARACTERS Parameter

Når vi indstiller NLS_TERRITORY parameter (som i det foregående eksempel), angiver dette implicit en masse andre parametre, inklusive NLS_NUMERIC_CHARACTERS parameter.

Than NLS_NUMERIC_CHARACTERS parameter bestemmer, hvilke tegn der bruges til gruppeseparator og decimaltegn.

Vi kan forespørge på V$NLS_PARAMETERS visning for at se, hvilke tegn der bruges til gruppeseparator og decimaltegn:

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

Resultat:

,.

Her ser vi, at decimaltegnet er repræsenteret med et komma, og gruppeseparatoren er repræsenteret af et punktum.

Du kan ændre værdien af ​​NLS_NUMERIC_CHARACTERS parameter direkte, hvis du vil (dvs. uden at ændre NLS_TERRITORY parameter).

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

Resultat:

12,345.00

Men du bør nok undgå at gøre dette, fordi det forårsager en afbrydelse mellem NLS-parametre. Dine NLS-parametre afspejler ikke længere standardværdierne for det aktuelle område. Medmindre du har en god grund til ikke at gøre det, er det normalt bedre at ændre NLS_TERRITORY parameter til det relevante område, så andre parametre også kan opdateres til deres standard for det nye område.

'nlsparam' Argument

En ting jeg bør nævne er, at T0_CHAR() funktion accepterer et tredje argument, der gør det muligt midlertidigt at indstille forskellige NLS-parametre, inklusive NLS_NUMERIC_CHARACTERS parameter. Når du gør dette på funktionsniveau, ændrer det ikke værdien af ​​disse parametre for den aktuelle session.

Her er et eksempel:

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;

Resultat:

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

Her satte jeg sessionens territorium til Tyskland og kaldte derefter TO_CHAR() tre gange.

  • Det første opkald bruger sessionens NLS-parametre. Det betyder, at standardgruppeseparatoren er en periode.
  • I det andet opkald indstillede jeg eksplicit min egen NLS_NUMERIC_CHARACTERS parameter inde fra funktionen. I dette tilfælde indstiller jeg gruppeseparatoren til at være et komma. At gøre dette påvirkede ikke min sessions NLS-parametre, som det ses af det tredje opkald.
  • Det tredje opkald bruger sessionens NLS-parametre, ligesom det første opkald. Som vi kan se, er gruppeseparatoren og decimaltegn ikke blevet påvirket af den (midlertidige) ændring, som vi foretog i vores andet opkald.

Hardkodet komma

En anden måde at tilføje et komma til et tal på er at hardkode det ind i din formatmodel.

Eksempel:

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

Resultat:

12,345.00

I dette tilfælde har jeg hårdkodet kommaet og punktum. Hvis du gør dette, ignoreres gruppeseparatoren indstillet i NLS_NUMERIC_CHARACTERS parameter.

Flere kommaer

Du kan have flere kommaer og/eller gruppeseparatorer i en formatmodel.

Eksempel:

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

Resultat:

123,456,789.00

Ugyldig kommaplacering

Et komma- eller gruppeseparator kan ikke vises til højre for et decimaltegn eller et punktum i en talformatmodel.

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

Resultat:

Error report -
ORA-01481: invalid number format model

  1. Måder at vide, hvordan man håndterer databasekorruption i SQL Server

  2. MySQL Indsætte i flere tabeller? (Databasenormalisering?)

  3. Samlet strengsammenkædning i Oracle 10g

  4. LIMIT 10..20 i SQL Server